输入Traits和const / volatile /& /&&

时间:2015-02-27 13:29:05

标签: c++ template-meta-programming

使用部分模板专业化编写特征类时,请说

template <typename> class Foo {};

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

template <typename T>
struct is_instance_of_foo<Foo<T>> : std::true_type { };

当类型不完全Foo<...>但某些const / volatile / & / &&合格版Foo时,该特征会评价为假。使用std::decay来剥离这些限定符是一种好习惯吗?

template <typename T>
using is_instance_of_foo2 = is_instance_of_foo<std::decay_t<T>>;

或者预期is_instance_of_foo<Foo<char> const &>::value是假的吗?

1 个答案:

答案 0 :(得分:3)

我会说这实际上取决于特征的所需语义(等效:预期用途)。在某些情况下,您可能希望涵盖Foo<T>上的“基于”,在其他情况下,只有Foo<T>本身就是您所追求的。

单独使用名称,我可能会使用std::remove_cv作为包装器。 const Foo<T>仍然是Foo的实例化。 Foo<T> &绝对是 - 它甚至不是类类型,它是一个参考。

相关问题