Ostatnio dużo programowałem w Javie, teraz wracam do moich korzeni C++ (naprawdę zacząłem pomijać wskaźniki i błędy segmentacji). Wiedząc, że C++ ma szerokie wsparcie dla szablonów, zastanawiałem się, czy ma pewne możliwości Javy, które mogłyby być przydatne do pisania uogólnionego kodu. Powiedzmy, że mam dwie grupy klas. Jedna z nich ma metodę first()
, druga ma metodę second()
. Czy istnieje sposób na wyspecjalizowanie szablonów do wyboru przez kompilator w zależności od metod, które posiada jedna klasa? Jestem zmierzające do zachowania, który jest podobny do jednego z Java:Specjalizujące szablony oparte na metodach
public class Main {
public static void main(String[] args) {
First first =() -> System.out.println("first");
Second second =() -> System.out.println("second");
method(first);
method(second);
}
static <T extends First> void method(T argument) {
argument.first();
}
static <T extends Second> void method(T argument) {
argument.second();
}
}
Gdzie First
i Second
interfejsy. Wiem, że mógłbym pogrupować obie te grupy, wyprowadzając każdą z nich z wyższej klasy, ale nie zawsze jest to możliwe (nie ma autoboxingu w C++ i niektóre klasy nie dziedziczą po wspólnym przodku).
Dobrym przykładem moich potrzeb jest biblioteka STL, w której niektóre klasy mają metody takie jak push()
, a niektóre inne mają insert()
lub push_back()
. Powiedzmy, że chcę utworzyć funkcję, która musi wstawiać wiele wartości do kontenera przy użyciu funkcji variadic. W Javie jest to łatwe do wykonania, ponieważ kolekcje mają wspólnego przodka. Z drugiej strony w C++ nie zawsze tak jest. Próbowałem go przez kaczki-pisania, ale kompilator daje komunikat o błędzie:
template <typename T>
void generic_fcn(T argument) {
argument.first();
}
template <typename T>
void generic_fcn(T argument) {
argument.second();
}
Więc moje pytanie brzmi: czy wdrożenia takiego zachowania możliwe bez tworzenia niepotrzebnego kodu boileplate przez specjalizującą się każdy pojedynczy przypadek?
Można użyć klasę polityczną jako kolejny parametr szablonu i dziedziczą z niego. Następnie masz implementacje strategii dla różnych typów kontenerów. Zobacz także [Projektowanie oparte na zasadach] (https://en.wikipedia.org/wiki/Policy-based_design) –
Czy możesz pokazać mi przykład, jak to rozwiązać problem? Bo wygląda na to, że warto spróbować. –
Jest przykład w artykule wikipedia, a jeśli szukasz tych słów, znajdziesz o wiele więcej. –