c++ - 如何检查参数包中的每种类型是否唯一?

标签 c++ c++11 templates variadic-templates

<分区>

对于固定数量的模板参数,这很容易,尽管手动编写的检查数量呈二次方增长。

#include <type_traits>

template <
    typename T1,
    typename T2,
    typename T3,
    typename T4>
struct unique_types
{
    static_assert(!std::is_same<T1, T2>::value, "Types must be unique");
    static_assert(!std::is_same<T1, T3>::value, "Types must be unique");
    static_assert(!std::is_same<T1, T4>::value, "Types must be unique");
    static_assert(!std::is_same<T2, T3>::value, "Types must be unique");
    static_assert(!std::is_same<T2, T4>::value, "Types must be unique");
    static_assert(!std::is_same<T3, T4>::value, "Types must be unique");
};

int main()
{
    // OK.
    unique_types<int, double, char, float> foo;

    // Should not compile.
    unique_types<int, double, char, double> bar;
}

对于具有任意数量类型的参数包如何实现?

最佳答案

你可以这样做:

#include <type_traits>

template <class ... Trest>
struct unique_types;

template <class T1, class T2, class ... Trest>
struct unique_types<T1, T2, Trest ...>
 : unique_types<T1, T2>, unique_types<T1, Trest ...>, unique_types<T2, Trest ...> {};

template <class T1, class T2>
struct unique_types<T1, T2>
{
    static_assert(!std::is_same<T1, T2>::value, "Types must be unique");
};

int main()
{
    // OK.
    unique_types<int, double, char, float> foo;

    // Should not compile.
    unique_types<int, double, char, double> bar;
}

关于c++ - 如何检查参数包中的每种类型是否唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41932213/

相关文章:

c++ - 稳定时钟如何与有限位时间表示交互?

c++ - 常量表达式的问题

c++ - 在函数声明中推导 shared_ptr T

C++ 模板 : no matching function for call

字符串的 C++ fwrite 和 fread

c++ - 3d 空间中两个 vector 之间的角度

c++ - 成员初始化器列表。参数评估顺序

c++11 - 为什么 decltype 的行为是这样定义的?

c++ - 未找到符号 C++ 打印 vector 到控制台

python - CSS 文件未应用于瓶中的 TPL