首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++可变模板迭代向量和比较元素

C++可变模板迭代向量和比较元素
EN

Stack Overflow用户
提问于 2015-09-29 15:33:16
回答 2查看 431关注 0票数 9

我有一个多样化的类模板

代码语言:javascript
复制
template <size_t ...T>
struct Foo 
{
   std::vector<size_t> t;

   bool IsEqual()
   {
     //??
   }

};

我想用的是:

代码语言:javascript
复制
Foo<1,2,3,4> foo;
foo.data = {1,2,3,4};
foo.IsEqual();

如果元素与模板参数的顺序相同,我如何实现IsEqual来迭代和比较向量的每个元素并返回false / true?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-29 15:43:24

使用索引序列技巧:

代码语言:javascript
复制
bool IsEqual()
{
    return t.size() == sizeof...(T) &&
        IsEqual(std::make_index_sequence<sizeof...(T)>{});
}

通过以下方式:

代码语言:javascript
复制
template <size_t... Is>
bool IsEqual(std::index_sequence<Is...> ) {
    bool valid = true;
    using expander = int[];
    expander{0,
        (valid = valid && t[Is] == T,
        0)...
    };

    return valid;
}    

甚至可以在一个函数中利用初始化器-子句中的每一个值计算和副作用都在下一个函数之前排序的事实,一次执行一次就可以做到这一点:

代码语言:javascript
复制
bool IsEqual()
{
    if (t.size() == sizeof...(T)) {
        auto it = t.begin();
        bool valid = true;

        using expander = int[];
        expander{0,
            (valid = valid && *it++ == T,
            0)...
        };

        return valid;
    }
    else {
        return false;
    }
}
票数 6
EN

Stack Overflow用户

发布于 2015-09-29 15:55:45

只需解压缩模板参数。

代码语言:javascript
复制
template <size_t ...T>
struct Foo
{
  std::vector<size_t> t;

  bool IsEqualTemplate(size_t index)
  {
    return true;
  }

  template <typename FIRSTARG, typename ...OTHERARGS>
  bool IsEqualTemplate(size_t index, FIRSTARG firstArg, OTHERARGS... otherArgs)
  {
    return t[index] == firstArg && IsEqualTemplate(index + 1, otherArgs...);
  }

  bool IsEqual()
  {
    return t.size() == sizeof...(T) ? IsEqualTemplate(0, T...) : false;
  }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32848107

复制
相关文章

相似问题

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