Я пытаюсь создать универсальный класс, который принимает пакет типов, сохраняет их в кортеже и может применять к ним функцию.
До сих пор я пробовал следующее:
#include <tuple>
struct Base{
virtual void base_function() = 0;
};
template<typename ...T>
struct A : public Base{
std::tuple<T...> as;
A(T... pack):as(pack...){};
void base_function(){
std::apply([](auto t){t.base_function();}, as);
}
};
struct B : public Base{
void base_function(){};
};
struct C : public Base{
void base_function(){};
};
struct D : A<B, C>{
D():A(B(),C()){};
};
Я ожидал, что вызов будет вызываться для base_function из классов B и C при вызове base_function для D. Но компилятор генерирует следующую ошибку:
ошибка: не соответствует функция для вызова
'__invoke(A<T>::base_function() [with T = {B, C}]::<lambda(auto:1)>,
std::__tuple_element_t<0, std::tuple<B, C> >&,
std::__tuple_element_t<1, std::tuple<B, C> >&)
'