我有一个多样化的类模板
template <size_t ...T>
struct Foo
{
std::vector<size_t> t;
bool IsEqual()
{
//??
}
};我想用的是:
Foo<1,2,3,4> foo;
foo.data = {1,2,3,4};
foo.IsEqual();如果元素与模板参数的顺序相同,我如何实现IsEqual来迭代和比较向量的每个元素并返回false / true?
发布于 2015-09-29 15:43:24
使用索引序列技巧:
bool IsEqual()
{
return t.size() == sizeof...(T) &&
IsEqual(std::make_index_sequence<sizeof...(T)>{});
}通过以下方式:
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;
} 甚至可以在一个函数中利用初始化器-子句中的每一个值计算和副作用都在下一个函数之前排序的事实,一次执行一次就可以做到这一点:
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;
}
}发布于 2015-09-29 15:55:45
只需解压缩模板参数。
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;
}
};https://stackoverflow.com/questions/32848107
复制相似问题