模板元程序,以查找类似的连续类型名称

Var*_*wal 4 c++ type-traits template-meta-programming variadic-templates c++11

我是模板元编程的新手,并且正在尝试创建一个程序,该程序将查找参数包是否具有连续相同的类型名称.例如<int, int>,<int, char, char>将返回true,<int,char><int, char, int>不会.

我设法编写了这段代码,但似乎是将参数包的每个值与自身进行比较.我只是想找到一种方法来迭代参数包的值来与它的连续元素进行比较.

template<typename T, typename U>
struct sameTypename{
    enum {value = false};
};

template<typename T>
struct sameTypename<T, T>{
    enum {value = true};
};

template <typename T, typename ...args>
struct consTypename{
    enum {value = (sameTypename<consTypename<args...>, consTypename<args...>>::value)};
};

template <typename T>
struct consTypename<T, T>{
    enum {value = true};
};

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

Hol*_*Cat 8

干得好:

#include <type_traits>

template <typename ...P> struct has_adjacent_same_types : std::false_type {};
template <typename A, typename B, typename ...P> struct has_adjacent_same_types<A, B, P...>
    : std::bool_constant<std::is_same_v<A,B> || has_adjacent_same_types<B, P...>::value> {};
Run Code Online (Sandbox Code Playgroud)

我分别使用: std::false_type {};: std::bool_constant<X> {};不是
{enum{value = false};};{enum{value = X};};,但这只是一个偏好问题.


我使用的一些功能来自C++ 17.如果您使用的是旧版本,请注意:

std::bool_constant并且std::is_same_v仅从C++ 17开始可用(但您可以使用之前std::integral_constantstd::is_same<>::value之前).

(c)@ max66