首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++模板帮助

c++模板帮助
EN

Stack Overflow用户
提问于 2009-06-11 05:18:53
回答 2查看 5.5K关注 0票数 2

好的,我写了一个类似stl的算法,叫做cartesian_product。对于那些不知道的人来说,笛卡尔乘积是来自两个集合的每一个可能的元素对。所以{1, 2, 3}{10, 20, 30}的笛卡尔乘积是

{(1,10), (1,20), (1,30), (2,10), (2,20), (2,30), (3,10), (3,20), (3,30)}

因此,该函数如下所示

代码语言:javascript
复制
template <typename InIt1, typename InIt2, typename OutIt>
void
cartesian_product(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt out)
{
    for (; first1 != last1; ++first1)
        for (InIt2 it = first2; it != last2; ++it)
            *out++ = std::make_pair(*first1, *it);
}

没有模板typedefs,所以我创建了一个特征类来保存输出迭代器的类型:

代码语言:javascript
复制
template <typename ObjA, typename ObjB, template <typename> class Container>
struct cartesian_product_traits
{
    typedef Container<std::pair<ObjA, ObjB> > type;
};

所以我可以说:

代码语言:javascript
复制
typedef cartesian_product_traits<int, int, std::vector>::type IntPairList;
IntPairList my_list;
cartesian_product(v1.begin(), v1.end(), 
                  v2.begin(), v2.end(),
                  std::back_inserter(my_list);

但这似乎不能编译。我得到了一个很好的错误:

代码语言:javascript
复制
error C3201: the template parameter list for class template 'std::vector' does not match the template parameter list for template parameter 'Container'

所以我被难住了。我怎么才能让它工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-11 05:28:36

向量的模板参数列表不仅仅是一个元素,它需要两个元素:

代码语言:javascript
复制
template < class T, class Allocator = allocator<T> > class vector

因此,为了接受向量,您需要有一个带有两个空格的模板参数:

代码语言:javascript
复制
template <typename ObjA, typename ObjB, template <typename, typename> class Container>
struct cartesian_product_traits

编辑:删减了一些建议,误读了你的代码。

正确执行此操作的方法是在模板模板参数上使用变量宏:

代码语言:javascript
复制
template <typename ObjA, typename ObjB, template <typename ...> class Container>
struct cartesian_product_traits

但这远远不能成为一种标准。如果是我的代码,我可能只会让消费者敲打出完整的模板:

代码语言:javascript
复制
std::vector< std::pair<int, int> >

短于

代码语言:javascript
复制
cartesian_product_traits<int, int, vector>

而后者只有在笛卡尔乘积的定义改变的情况下才会有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2009-06-11 05:28:44

std::vector的模板实际上相当复杂(对于分配器和c,有可选的模板参数),而stdlib中的其他容器也不简单,如果是您的话,我会将cartesian_product_traits的第三个参数转换成一个普通的typename PairsContainer,并依靠调用者将其作为一个合适的成对容器传递。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/979436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档