Недавно я много программировал на Java, теперь я возвращаюсь к своим корням С++ (я действительно начал пропускать указатели и ошибки сегментации). Зная, что С++ имеет широкую поддержку шаблонов, мне было интересно, есть ли у него некоторые возможности Java, которые могут быть полезны для написания обобщенного кода. Допустим, у меня две группы классов. Один из них имеет метод first()
, другой - метод second()
. Есть ли способ специализировать шаблоны, которые будут выбраны компилятором в зависимости от методов, которыми обладает один класс? Я нацелен на поведение, которое похоже на поведение Java:
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();
}
}
Где First
и Second
- интерфейсы. Я знаю, что я мог бы группировать обе эти группы, выведя каждый из них из высшего класса, но это не всегда возможно (без автобоксинга в С++, а некоторые классы не наследуются от общего предка).
Хорошим примером моих потребностей является библиотека STL, где некоторые классы имеют такие методы, как push()
, а некоторые другие имеют insert()
или push_back()
. Допустим, я хочу создать функцию, которая должна вставлять несколько значений в контейнер с использованием вариационной функции. В Java это легко выполнить, потому что коллекции имеют общего предка. В С++, с другой стороны, это не всегда так. Я попробовал это с помощью утиного ввода, но компилятор выводит сообщение об ошибке:
template <typename T>
void generic_fcn(T argument) {
argument.first();
}
template <typename T>
void generic_fcn(T argument) {
argument.second();
}
Итак, мой вопрос: реализует ли такое поведение, не создавая ненужного кода boileplate, специализируясь на каждом конкретном случае?