#include <iostream>
#include <tuple>
// 定义类型序列
template <typename... Ts>
using TypeSequence = std::tuple<Ts...>;
// 辅助结构体用于遍历类型序列并调用成员函数
template <size_t Index, typename Tuple>
struct CallPrintHelper {
static void call(const Tuple& t) {
std::get<Index>(t).print();
CallPrintHelper<Index - 1, Tuple>::call(t);
}
};
template <typename Tuple>
struct CallPrintHelper<0, Tuple> {
static void call(const Tuple& t) {
std::get<0>(t).print();
}
};
// 模板函数用于遍历类型序列并调用print函数
template <typename... Ts>
void callPrint(const TypeSequence<Ts...>& t) {
CallPrintHelper<sizeof...(Ts) - 1, TypeSequence<Ts...>>::call(t);
}
// 示例类型
struct A {
void print() { std::cout << "A"; }
};
struct B {
void print() { std::cout << "B"; }
};
int main() {
TypeSequence<A, B> ts;
callPrint(ts);
return 0;
}
代码说明:
- 类型序列定义:使用
std::tuple
来定义类型序列TypeSequence
,std::tuple
可以容纳不同类型的元素。
- 辅助结构体
CallPrintHelper
:用于递归遍历类型序列并调用每个类型的print
函数。它通过模板参数Index
来获取std::tuple
中的元素并调用print
函数,然后递归调用Index - 1
位置的元素的print
函数。
- 模板函数
callPrint
:作为对外接口,调用CallPrintHelper
的call
函数开始遍历和调用。
- 示例类型
A
和B
:包含print
成员函数,用于演示调用。
main
函数:创建一个TypeSequence
对象并调用callPrint
函数来遍历并调用print
函数。