Мне нужно найти способ рекурсивного построения класса с учетом набора аргументов шаблона, чтобы класс наследовал от себя и построил метод f
для текущего аргумента первого шаблона в списке аргументов шаблона, а затем наследует от себя, передавая остальную часть списка.рекурсивное наследование для перегрузки метода для набора аргументов шаблона
Таким образом, в основном я хочу достигнуть следующий интерфейс для класса C
:
C<T1, T2, T3> c;
c
теперь есть методы C::f(T1)
, C::f(T2)
и C::f(T3)
Мой подход до сих пор было так:
// primary template
template <class H, class...>
class C {};
// base case where class... is empty
template <class H, class...>
class C<H>
{
public:
void f(const H& h){
// std::cout << typeid(h).name() << "\n";
}
};
// recursive case where T is nonempty
template <class H, class... T>
class C : public C<T...>
{
public:
void f(const H& h){
// std::cout << typeid(h).name() << "\n";
}
};
Это фактически не компилируется, так как я получаю
error: redefinition of 'C' class C : public C
Является ли мой подход принципиально возможным и просто вопросом семантически или синтаксически недействительного кода или этот подход не работает в принципе?
спасибо, но с вашей второй конструкцией я получаю сообщение об ошибке: 'error: member 'f' найдено в нескольких базовых классах разных типов. –
Можете работать с ним, добавляя' using F :: f; ' и 'используя C :: f;' в основной шаблон. –
Хорошо, попробуем это, но я заметил что-то еще: с вашим первым проектом для следующей программы 'int main() { C c; int i = 10; char ch = 'a'; c.f (i); c.f (ch); } 'Я получаю вывод' c c' ..., что означает, что вызываются только перегрузки для первого аргумента шаблона. Обратите внимание, что у меня есть 'std :: cout << typeid (T) .name() <<" \ n ";' in 'C :: f' –