如何比较高阶类型?

时间:2014-11-17 17:09:16

标签: c++

我希望有这样的东西:

std::cout << std::is_same<Buffer<int>, Buffer<float>>::value;

但是我不想比较整个类型,而只想知道类型是否是缓冲区。

std::cout << std::is_buffer<Buffer<int>>::value // true;
std::cout << std::is_buffer<Buffer<float>>::value // true;

这可能吗?也许借助模板模板?

3 个答案:

答案 0 :(得分:3)

只是做一个简单的特质:

#include <type_traits>

template<typename T>
struct is_buffer : std::false_type {};

template<typename T>
struct is_buffer<Buffer<T>> : std::true_type {};

但这并没有考虑到cv-qualifiers。

如果你想考虑cv-qualifiers,你只需要将它专门化一点:

template<typename T>
struct is_buffer<const T> : is_buffer<T> {};

template<typename T>
struct is_buffer<volatile T> : is_buffer<T> {};

答案 1 :(得分:2)

您可以实现如下的特征类:

#include <type_traits>

template<class T> struct is_buffer : std::false_type {};

template<class T> struct is_buffer<Buffer<T> > : std::true_type {};

答案 2 :(得分:1)

template<typename T>
class is_buffer : public std::false_type
{ };

template<typename T>
class is_buffer<Buffer<T>> : public std::true_type
{ };

因此,如果模板参数的类型为is_buffer,则将使用继承std::true_type的{​​{1}},否则将使用Buffer<T>