【发布时间】:2019-02-11 13:21:34
【问题描述】:
我正在尝试创建一个通用类,它采用一组类型,将它们存储在一个元组中,并且可以对它们应用一个函数。
到目前为止,我尝试了以下内容:
#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()){};
};
当在 D 上调用 base_function 时,我希望 apply 在 B 类和 C 类的 base_function 上被调用。但是编译器会生成以下错误:
错误:没有匹配的调用函数
'__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> >&)'
【问题讨论】:
-
您知道,
Base和D类(以及从Base继承的任何类)对于最小示例来说不是必需的。即使没有它们,您的问题也会以同样的方式表现出来(@Jarod42 的解决方案也是如此)。 -
@Spencer 删除 D 类不会产生错误,因为编译器不会在没有声明 A 版本的情况下生成任何代码。基类在精简代码时就在那里,并在那里提供一些上下文
-
但是您可以在声明
D对象的任何位置声明A<B,C>。
标签: c++ templates c++17 stdapply