确保可变参数模板不包含重复项

Jyt*_*tug 2 c++ templates variadic-templates c++11

我想我的整个问题在标题中都有很好的描述。我正在尝试创建一个可变参数类模板(在 C++11、C++14 或 C++1z 中)。

template<typename ...Types> struct MyVariadicTemplate {};
Run Code Online (Sandbox Code Playgroud)

并确保任何实例化中的类型列表MyVariadicTemplate都是单射的,例如,如果我调用以下代码段:

MyVariadicTemplate<int, double, int> x;
Run Code Online (Sandbox Code Playgroud)

它不会编译(我很乐意以某种方式使用static_assert)。

我会很感激的提示。

The*_*tor 5

这可以在两个元函数的帮助下编写。

首先,IsContained检查类型是否出现在类型列表中。

template <typename T, typename... List>
struct IsContained;

template <typename T, typename Head, typename... Tail>
struct IsContained<T, Head, Tail...>
{
    enum { value = std::is_same<T, Head>::value || IsContained<T, Tail...>::value };
};

template <typename T>
struct IsContained<T>
{
    enum { value = false };
};
Run Code Online (Sandbox Code Playgroud)

其次,IsUnique检查类型列表是否不包含重复项。它用于IsContained检查所有元素组合。

template <typename... List>
struct IsUnique;

template <typename Head, typename... Tail>
struct IsUnique<Head, Tail...>
{
    enum { value = !IsContained<Head, Tail...>::value && IsUnique<Tail...>::value };
};

template <>
struct IsUnique<>
{
    enum { value = true };
};
Run Code Online (Sandbox Code Playgroud)

使用这些工具,静态断言非常简单:

template <typename... Ts>
struct NoDuplicates
{
    static_assert(IsUnique<Ts...>::value, "No duplicate types allowed");
};
Run Code Online (Sandbox Code Playgroud)