2013-04-17 28 views
5

Co chcę zrobić, to utworzyć funkcję, która akceptuje dowolną klasę lub strukturę (za pośrednictwem szablonów), ale również ma funkcję, która zakłada, że ​​zawsze istnieje określony element w klasie lub strukturze przekazanej.Czy mogę uzyskać dostęp do elementu struct/class z szablonu?

W chyba-nie-poprawny kod, będzie to wyglądać mniej więcej tak:

template <class inputType> 
int doSomething(inputType voxel) 
{ 
    return voxel.density; 
} 

chcę go założyć, że density członek zawsze będzie tam i że będzie ona zawsze być int (lub cokolwiek). Czy mogę to zrobić? A jeśli tak, co się stanie, jeśli density nie istnieje? Czy po prostu wyrzuci błąd kompilatora?

Odpowiedz

4

Jest to całkowicie legalne, szablony w C++ nie są porównywalne z innym podejściem (myślę, że Java), który sprawdza typową metodę lub klasy, zachowując zmienną typu.

Szablon C++ jest kompilowany z każdym możliwym typem, którego używasz, więc każda instancja dla każdego określonego typu jest kompilowana i sprawdzana. Jeśli spróbujesz uzyskać dostęp do pola, które nie jest zawarte w typie, którego używasz, używając doSomething, otrzymasz błąd kompilatora.

+0

Wow! Odpowiedziałeś na moje pytanie 3 minuty po tym, jak je zadałem! Dzięki! (Plus to dokładnie to, na co liczyłem) – Clonkex

1

Z pewnością możesz to zrobić, szablony będą tworzone w czasie kompilacji, a jeśli typ nie ma tego elementu, to nie będzie się kompilował i otrzymasz błąd. Funkcje szablonów są w zasadzie umowami i dopóki typ, którego używasz, jest zgodny z umową, wtedy będzie działać.

W tym przypadku chciałbym również zaproponować eksperymentowanie z nim, strony takie jak LiveWorkSpace sprawiają, że eksperymentowanie z C/C++ jest łatwe i bezbolesne, gdziekolwiek jesteś i obsługują najnowsze wersje. Dowiesz się o wiele więcej, wypróbowując takie rzeczy. Możesz znaleźć więcej takich narzędzi w poprzednim thread.

+0

Dzięki, popatrzę na to. Wiem, że powinienem był wypróbować to w kodzie _przedtem pytając, ale to oznaczałoby albo wiele czasu, modyfikując mój bieżący projekt, albo tworząc nowy projekt tylko do testowania. Obie opcje nie były bardzo atrakcyjne. (Po prostu wypróbowałem LiveWorkSpace, a strona wydaje się być niedostępna.) – Clonkex

+0

@ Clonkex Używam dość często LiveWorkSpace, ale zauważyłem, że nie działa, więc dodałem drugi link, który ma wiele innych opcji. Zwykle nie sugeruję, aby ktoś po prostu eksperymentował, ale wydawało się, że masz wystarczająco dużo informacji, aby skutecznie rozwiązać problem, a czasami zdajesz sobie sprawę, że bariera eksperymentu jest mniejsza niż myślisz, że może pomóc. –

+0

Absolutnie; gdybym pomyślał o użyciu kompilatorów online C++ przed opublikowaniem pytania, które bym miał. Zastanawiałem się nad stworzeniem nowego projektu tylko po to, aby go przetestować, ale potem zdecydowałem, że prawdopodobnie lepiej byłoby upewnić się, że jest rzeczywiście dozwolone w C++, nawet jeśli zostało skompilowane pomyślnie (może się skompilować, ale później spowodować ukryte problemy). Dzięki za link :) – Clonkex

Powiązane problemy