如何检查两个参数包是否相同,忽略它们的内部顺序?
到目前为止,我只有框架(使用std::tuple),但没有功能.
#include <tuple>
#include <type_traits>
template <typename, typename>
struct type_set_eq : std::false_type
{
};
template <typename ... Types1, typename ... Types2>
struct type_set_eq<std::tuple<Types1...>, std::tuple<Types2...>>
: std::true_type
{
// Should only be true_type if the sets of types are equal
};
int main() {
using t1 = std::tuple<int, double>;
using t2 = std::tuple<double, int>;
using t3 = std::tuple<int, double, char>;
static_assert(type_set_eq<t1, t1>::value, "err");
static_assert(type_set_eq<t1, t2>::value, "err");
static_assert(!type_set_eq<t1, t3>::value, "err");
}
Run Code Online (Sandbox Code Playgroud)
每个类型不允许在一个集合中出现多次.
c++ templates template-meta-programming variadic-templates c++11
如何写一个模板 meta_set<class...Args>,使得 meta_set::type` 对于 Ts 的所有排列都是相同的?
换句话说,meta_set<>::type无论顺序如何,只要参数列表相同,我们就希望具有相同的值,也就是说,当将其视为一个集合(或多集合,如果更容易的话)。
例如,
std::is_same< meta_set<int,double,string>::type, meta_set<double,string,int>::type >::value == true
std::is_same< meta_set<int,double,string>::type, meta_set<double,string,bool>::type >::value == false
Run Code Online (Sandbox Code Playgroud)
当您希望每个模板参数集有一个模板的单个实例化时,这可能会派上用场。
注意:这不是家庭作业,而是我在工作中处理模板繁重代码时感到好奇的事情。我不是元编程专家,所以我想也许人们可以分享他们的知识。
c++ template-meta-programming variadic-templates c++11 c++14