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?
使用索引序列技巧:
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)
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |