W C to dość powszechne w użyciu void *
stworzyć ogólny zbiór. Na przykład, jeśli chcesz ogólną listę powiązane, można napisać coś takiego:
typedef struct node {
void *data;
struct node *next;
} node;
Następnie można utworzyć jedną połączoną listę foo
, innego powiązanego listę bar
, i tak dalej.
W języku C++ jest to jednak rzadko przydatne. W typowym przypadku, że chcesz napisać równoważny kod jako szablonu zamiast:
template <typename T>
class node {
T data;
node *next;
};
przypadku starszych kompilatorów, można zmniejszyć kod wygenerowany przez połączenie tych dwóch technik. W takim przypadku użyjesz zbioru wskaźników do unieważnienia danych, a następnie szablonowego interfejsu, który po prostu obsłuży odlewanie T *
do podczas przechowywania danych iz powrotem od void *
do T *
po pobraniu dane.
Ulepszenia w kompilatorach/linkerach sprawiły, że ta technika (prawie?) Jest całkowicie przestarzała. Starsze kompilatory generowałyby oddzielny kod dla każdego typu, w którym utworzono twój szablon, nawet gdy typ tworzenia instancji był nieistotny. Bieżące kompilatory (lub w ogóle łańcuchy narzędzi - całkiem sporo z tego jest naprawdę obsługiwane przez linker) identyfikują identyczne sekwencje kodu i łączą je automatycznie.
Konkluzja: chyba trzeba zgodności C, albo piszesz zastępstwo operator new
/operator delete
, wykorzystanie void *
dobrze napisany w C++ jest zwykle dość rzadkie.
C++ zazwyczaj ma lepsze alternatywy, i wiem, że istnieje specyficzny dupek tego, o którym myślę. – chris
W C++ nigdy nie używaj 'void *' oczekiwać w * bardzo * wyjątkowych okolicznościach. –
To jedna z * tych * funkcji. Jeśli nie wiesz, czy go potrzebujesz, nie potrzebujesz go. – delnan