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

Mar*_*rry 9 c++ templates variadic-templates c++11

我有一个可变的类模板

template <size_t ...T>
struct Foo 
{
   std::vector<size_t> t;

   bool IsEqual()
   {
     //??
   }

};
Run Code Online (Sandbox Code Playgroud)

我想用它们:

Foo<1,2,3,4> foo;
foo.data = {1,2,3,4};
foo.IsEqual();
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 6

使用索引序列技巧:

bool IsEqual()
{
    return t.size() == sizeof...(T) &&
        IsEqual(std::make_index_sequence<sizeof...(T)>{});
}
Run Code Online (Sandbox Code Playgroud)

有:

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;
}    
Run Code Online (Sandbox Code Playgroud)

甚至可以通过利用以下事实来在一个函数中执行此操作:初始化子句中的每个值计算和副作用在下一个之前按顺序排序:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)