问题描述
我已经定义了一个这样的类型列表:
template <typename ... Types> struct typelist {};
using my_list = typelist<int,double,bool,float>;
现在我有一个功能模板,例如
template<typename T>
void foo() {
std::cout << typeid(T).name() << std::endl;
}
,并希望为类型列表中的每种类型调用此名称:
foo<int>();
foo<double>();
foo<bool>();
foo<float>();
我试图找到一种递归的方法来解决这个问题,但是我很难为所需的foo函数定义正确的(可能是嵌套的)可变参数模板。您是否有解决此问题的灵巧解决方案的提示?
解决方法
template<class... Types> auto foo_foreach(typelist<Types...>) {
return (foo<Types>(),...);
}
int main() {
foo_foreach(my_list{});
}
对于一个真正的老式学校,好吧,请使用您之前尝试过的模板递归:
void foo_foreach(typelist<>) {}
template<class Head,class... Tail> void foo_foreach(typelist<Head,Tail...>);
template<class Head,Tail...>) {
foo<Head>();
foo_foreach(typelist<Tail...>{});
}
,
这是一个仅使用lambda模板的 c ++ 20 答案。
template <typename... Ts,typename C>
constexpr void for_types(C&& c) {
(c.template operator()<Ts>(),...);
}
for_types<int,float,char>([]<typename T>()
{
std::cout << typeid(T).name() << std::endl;
});