在可变参数模板类型列表的每种类型上运行的函数

问题描述

我已经定义了一个这样的类型列表:

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;
});

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...