Generic Java jest bliższy wypełnianiu boost::any
w zmiennej self
niż w C++. Spróbuj. Szablony C++ tworzą typy, które domyślnie nie mają nawiązywania ze środowiskiem wykonawczym ani relacjami dynamicznymi.
Możesz wprowadzić taką relację ręcznie, na przykład za pomocą wspólnego rodzica i typu wymazania i rozsądnego użycia pImpl
i inteligentnych wskaźników.
Typowe argumenty typu C są nieobrabiane w C++ 11. Argumenty w szablonie Variardic są bardzo bezpieczne, tak długo jak twój kompilator obsługuje je (CTP 2012 dla MSVC 2012 ma wsparcie dla nich (nie aktualizacja 1, CTP), podobnie jak clang i nieaktualne wersje gcc).
Szablony w C++ to rodzaj metaprogramowania, bliższego napisania programu, który pisze program niż Java Generics. Java Generic ma jedną wspólną implementację "binarną", podczas gdy każda instancja szablonu C++ jest zupełnie innym "programem" (który, za pomocą takich procedur jak składanie COMDAT, można zredukować do jednej implementacji binarnej), którego szczegóły są opisane przez szablon kod.
template<typename T>
struct Field {
T data;
};
to mały program, który mówi "tutaj jest jak tworzyć typy pól". Po przejechaniu w int
i double
, kompilator robi coś mniej więcej takiego:
struct Field__int__ {
int data;
};
struct Field__double__ {
double data;
};
i nie można spodziewać się te dwa rodzaje być wymienialne pomiędzy.
rodzajowych Java, z drugiej strony, stworzyć coś takiego:
struct Field {
boost::any __data__;
template<typename T>
T __get_data() {
__data__.get<T>();
}
template<typename T>
void __set_data(T& t) {
__data__.set(t);
}
property data; // reading uses __get_data(), writing uses __set_data()
};
boost::any
gdzie jest kontener, który może pomieścić wystąpienie dowolnego typu, a dostęp do pola data
przekierowuje przez te dostępowych.
C++ zapewnia możliwość napisania czegoś podobnego do generycznych Java przy użyciu metaprogramowania szablonów. Aby napisać coś takiego jak szablony C++ w Javie, musielibyśmy mieć własny wyjściowy bajt Javy w języku Java lub kod źródłowy, a następnie uruchomić ten kod w taki sposób, aby debugger mógł się połączyć z kodem, który zapisuje kod jako źródło błędów.
Inicjacje tego samego szablonu z różnymi argumentami szablonu są całkowicie niezwiązanymi typami. Co masz zamiar zrobić z obiektami 'Field', gdy je już masz? C++ * ma * szablony variadyczne (http://en.wikipedia.org/wiki/Variadic_template) (które mogą być używane do tworzenia funkcji variadycznych typu safe). – Mankarse
funkcja będzie tylko przechowywała każde z pól w wektorze na później, więc naprawdę nie obchodzi mnie, jakie są ich typy _are_. Bezpieczeństwo typowe dla variadics w C++ jest naprawdę poważnym problemem, ponieważ jeśli kod ulegnie awarii podczas wysyłania błędnych typów, dobrze nie rób tego wtedy (czyli defensywnie i sprawdź typy osobiście przed wywołaniem funkcji) . Wiem, że Field i Field nie są w rzeczywistości powiązane (nie-(współwystępowanie) -variancji uniemożliwiło (no, nie do końca, ale było niewygodne) parametrów szablonów innych niż klasowe). –
@MattG Więc wszystkie pola mają postać _one_ vector? W takim przypadku jeszcze trudniejszym pytaniem będzie, jaki powinien być typ tego wektora. – jogojapan