可变参数模板类扩展
Variadic template class expansion
我有以下模板类,我想在其中循环浏览模板类型并为每种类型做一些事情。这是一个简化的示例。
template<class... T>
class Handler
{
private:
template<class A>
void Do1_(int a, int b)
{
A obj{};
obj.Process(a, b);
}
template<class A, class... B>
void Do_(int a, int b)
{
Do1_<A>(a, b);
Do_<B...>(a, b);
}
public:
void Do(int a, int b)
{
Do_<T...>(a, b);
}
};
struct Foo1 {
void Process(int a, int b) {}
};
struct Foo2 {
void Process(int a, int b) {}
};
class Bar : public Handler<Foo1, Foo2> {};
但是Do_<B...>
的扩展给我带来了麻烦,我在编译Do_<B...>
时收到有关"无法推断'A'的模板参数"的编译错误。如果可能的话,正确的扩展应该在这里进行编译。
你把事情复杂化了。这应该可以(没有双关语):
template<class... T>
class Handler
{
public:
void Do(int a, int b) {
int dummy[] = {(T{}.Process(a, b), 0)...};
}
};
演示
相关文章:
- std::具有相同基类的类的变体
- 访问者访问变体并返回不同类型时出错
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 我应该使用什么来代替void作为变体中的替代类型之一
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- 如何比较自定义类的std::变体
- 通过网络、跨平台传递std::变体是否安全
- 我可以在C++中扩展变体吗?
- 聚合初始化的 C++17 扩展是否使大括号初始化变得危险?
- 从C 中的PHP扩展中获取函数参数值
- C++11:变分模板函数参数包扩展执行顺序
- 如何使用基于 IExecuteCommand 的 shell 扩展将某些上下文菜单选项变灰
- 使用 MPL 列表扩展提升变体
- 扩展'isalnum'以识别 UTF-8 变音符号
- 扩展非类型形参包来定义带有非类型形参的内部类模板是否合法?
- 编译器的区别:扩展x3::变体需要用gcc定义复制构造函数、复制赋值运算符和默认构造函数,但不需要clang
- 嵌入的铬 - 在不扩展类C++的情况下修改虚拟方法参数值