我想我的整个问题在标题中都有很好的描述。我正在尝试创建可变参数类模板(在C++ 11,C++ 14或C++ 1z中)。
template<typename ...Types> struct MyVariadicTemplate {};
并确保
MyVariadicTemplate
的任何实例化中的类型列表都是内射的,因此,例如,如果我调用以下代码:MyVariadicTemplate<int, double, int> x;
它不会编译(我很乐意使用
static_assert
做到这一点)。我将不胜感激。
最佳答案
这可以借助两个元函数来编写。
首先,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 };
};
其次,
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 };
};
使用这些工具,静态断言非常简单:
template <typename... Ts>
struct NoDuplicates
{
static_assert(IsUnique<Ts...>::value, "No duplicate types allowed");
};