迭代可变模板类的基类
Iterate over base classes of variadic template class
如何遍历可变模板类的所有基类并为每个基类调用函数?
下面是一个简单的例子:
struct A { void foo() { std::cout << "A" << std::endl; } };
struct B { void foo() { std::cout << "B" << std::endl; } };
struct C { void foo() { std::cout << "C" << std::endl; } };
template<typename... U>
struct X : public U...
{
void foo() {
static_cast<U*>(this)->foo()...; // ??? should call `foo` for all `U`
}
};
int main() {
X<A,B,C> x;
x.foo();
}
没有c++ 17的fold表达式通常是不行的。这里的省略号是无效的,星号后面的省略号会创建一个指针模板参数列表。为了重复适当的模式,省略号必须位于语句的末尾,而这在这里不起作用。我发现这篇文章是一个很好的资源包扩展。
相反,是的一个技巧,它不需要构建任何递归的东西:int arr[] = {(static_cast<U*>(this)->foo(), 0)...};
调用每个函数,然后使用带逗号操作符的结果生成所需的int
。不幸的是,这可能会导致一个未使用的变量警告。一种最小的方法是使用std::array
(或一些可以用初始化器列表初始化的类)并将创建其中一个未命名的类的结果强制转换为void
(强制转换为void
是一般防止警告的一种常见技术)。
方法如下:
struct thru{template<typename... A> thru(A&&...) {}};
struct A { void foo() { std::cout << "A" << std::endl; } };
struct B { void foo() { std::cout << "B" << std::endl; } };
struct C { void foo() { std::cout << "C" << std::endl; } };
template<typename... U>
struct X : public U...
{
void foo() { thru{(U::foo(), 0)...}; }
};
但是如果您关心调用的顺序,请注意这里讨论的已知的gcc错误。
相关文章:
- C++中带有List类的迭代器Segfault
- 跟随整数索引列表的自定义类迭代器
- C++迭代器:实现迭代器类时出错
- 如何迭代重载运算符 [] 的类?
- 迭代器类的重载前缀增量运算符会引发分段错误
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 使用迭代器的模板类的构造函数
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 容器类中的类迭代器
- 如何在基类中实现子类迭代器的统一接口?
- C++ 笛卡尔乘积迭代器在第一次迭代时调用基类函数
- 实现对映射进行迭代的类迭代器
- python和基类虚函数的迭代器
- 修复c++遗留代码:类迭代器
- 创建类迭代器
- c++类迭代器实用程序:定义和用法
- 迭代可变模板类的基类
- 朋友迭代器和朋友类迭代器在c++中的思想有什么不同
- 为基类设计基迭代器
- 在c++中通过std迭代器将基类强制转换为派生类