deus napisał(a)
#include <cstddef>
// ...
template <typename Type>
size_t fsizeof(const Type &) {
return (size_t)(((Type *)0) + 1);
}
ja opowiadam się jak najbardziej za tym, aby użyć tutaj wskaznika na 0x0, bo to jest właściwie malutka funkcja i jej kod nie musi wykorzystywać zewnętrznych definicji.
Dlaczego? Nie bedę powoływał się na jakiekolwiek publikacje.
Po prostu, zastanówcie się. NULL to zdefiniowana stała, stała, która przyjmuje umowną wartość 0. Ale czy wszędzie to musi być 0? Nie daj Boże, ktoś wymyśli coś innego i zacznie definiować null jako 'N'*2563+'U'*2562+'L'*2561+'L'*2560.
Co nas interesuje w funkcjach i bibliotekach? Mają działać, po prostu. To nie jest problem użytkownika (tj. programisty używającego) danej biblioteki, aby funkcja miała to, czy to. Biblioteka ma działać. Bezbłędnie. Zawsze.. Standardy powstają po to, aby sporne sprawy rozwiązywać i wyznaczać kierunek myślenia, w jakim powinni dążyć osoby o różnych wyobrażeniach co do rozwiązania danego problemu.
Teraz wyobraźcie sobie co stałoby się, jeśli zdefiniowalibyśmy sobie NULL jako 0xDEAD.
#define NULL 0xDEAD
template <typename T >
size_t fsizeof(const T&) {
return (size_t)(((Type *)NULL) + 1);
}
Wynik działania tej funkcji będzie błędny, a przecież tego bardzo chcemy uniknąć.
Może za kilka lat ktoś wymyśli coś takiego, że NULL to 0xDEAD. Według mnie dyskusja dot. tego, czy należy tutaj użyć NULL, czy 0 może zostać zobrazowana tym, czy należy w tym zadaniu obliczyć najdokładniejszą możliwą postać dziesiętną rozwinięcia liczby pi.
zadanie, oblicz: napisał(a)
1+6674pi*0
Po co robić coś, co można, po •1. zoptymalizować, po •2. zostawić w formie kompatybilnej-w-przód, po •3. nie wykorzystywać zewnętrznych definicji, tylko skorzystać z zaimplementowanych i bardzo lubianych operacji na typach w języku (tj. rzutowanie wskaźniki).
Do tego powiem, że jeśli jesteś naprawdę zwolennikiem definiowania pustych wskaźników jako NULL<font size="1">, tak jak ja</span>, to ten kod sizeof powinien wyglądać tak:
template <typename T >
size_t fsizeof(const T&) {
return (size_t)( (((Type *)NULL)+1) - ((Type *)NULL) );
}
;p