【发布时间】:2012-11-28 13:52:24
【问题描述】:
Cartesian Product of a vector of integer vectors 有一个出色的 C++ 解决方案(实际上有 2 个解决方案:递归和非递归)。为了说明/简单起见,让我们只关注非递归版本。
我的问题是,如何用模板泛化这段代码以获取如下所示的齐次向量 std::tuple:
{{2,5,9},{"foo","bar"}}
并生成tuple的齐次向量
{{2,"foo"},{2,"bar"},{5,"foo"},{5,"bar"},{9,"foo"},{9,"bar"}}
如果它让生活更轻松,让我们假设输入中的内部向量都是齐次的。所以像这样的输入是不允许的:{{5,"baz"}{'c',-2}}
EDIT将输入从锯齿状向量更改为元组
【问题讨论】:
-
这应该是可行的。创建
size_t的index<size>类型(基本上是size_t的n 元组)。创建一个序列模板类型,其中包含0到 #vectors-1 的值。创建一个模板来推断返回的元组的类型。创建一个递归函数,该函数遍历返回的叉积中的每个索引(传入一个函数以生成给定深度的最大索引)。使用 seq 对index和vector的tuple上的get()s 进行索引,并将调用包装在()...中,直接构造生成的tuple元素。那么鲍勃是你的叔叔。 -
我写了大约一半,但要睡觉了。 :) 这是使用序列展开
get调用的基本技术:stackoverflow.com/questions/13447063/…,这里是一堆可能包含有用内容的非工作代码:ideone.com/reaDYi
标签: c++ algorithm data-structures c++11 template-meta-programming