将可变参数模板的参数分成不同的列表?

Posted

技术标签:

【中文标题】将可变参数模板的参数分成不同的列表?【英文标题】:separating arguments for a variadic template into different lists? 【发布时间】:2016-03-30 17:29:14 【问题描述】:

是否可以将提供给类模板的类型“分离”到不同的列表中,以便我可以区别对待它们?我想要做的是如下所示。

Class<<A, B, C>, <1, 2, 3>> c; // initialization

template <<List1Args...>, <List2Args...>
class Class 
...
// do stuff on the first list of types
template<typename T>
void doStuffWithList1()  
...

template<typename First, typename Second, typename ... Rest>
void doStuffWithList1()  
...
doStuffWithList1<Second, Rest...>();


// do stuff on the second list of types
template<typename T>
void doStuffWithList2()  
...

template<typename First, typename Second, typename ... Rest>
void doStuffWithList2()  
...
doStuffWithList2<Second, Rest...>();

;

顺便说一句,有哪些好的资源/书籍可以让我了解有关 c++ 11 模板元编程的更多信息?

【问题讨论】:

实际用例是什么? 简短版本:将 2 个列表中的类型区别对待。我正在尝试使用可变参数模板来生成填充 std::map<:string std::function>; 的重复代码;注册表。 std::string 是使用 boost.type_index 传递给模板的类型的字符串表示形式。根据类型添加不同类型的功能。这是为 EntityX(用于游戏开发的实体系统框架)添加序列化。 如果你是从数据中构建代码,那么我认为使用工厂的运行时多态性是你能做到的,不是吗? 您能否发布一些示例客户端代码,即您设想的代码会将值放入此注册表。从上面的例子中很难想象你想要实现的目标 dl.dropboxusercontent.com/u/2138237/example.txt 我使用的库无法返回实体拥有的所有组件的列表,因此我使用类模板参数来测试该列表中存在哪些组件。现在,所有类型的组件都以相同的方式处理。但是有些组件需要以不同的方式序列化,这就是为什么我想要一种指定 2 个类型列表的方法。 【参考方案1】:

您可以使用std::tuplestd::integer_sequence 对类型/值进行分组。

template <typename Tuple, typename Sequence> class Class;

template <typename ...Ts, std::size_t ...Is>
class Class<std::tuple<Ts...>, std::index_sequence<Is...>>

    //...
;

Live example

【讨论】:

@victorious:我声明了一个带有 2 个模板参数(它们是类型)的类型。然后我将它专门用于聚合类型 std::tuple(这是一个 list 类型)和 std::index_sequence(这是一个 list 值)。

以上是关于将可变参数模板的参数分成不同的列表?的主要内容,如果未能解决你的问题,请参考以下文章

拆分可变参数模板参数

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

为啥可变参数模板的模板特化与非可变模板的特化不同?

可变参数模板调度程序

第21课 可变参数模板_展开参数包

每个可变参数模板参数生成一个类成员