将可变参数模板的参数分成不同的列表?
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::tuple
和std::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 值)。以上是关于将可变参数模板的参数分成不同的列表?的主要内容,如果未能解决你的问题,请参考以下文章