使用部分模板专业化编写特征类时,请说
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
是假的吗?
答案 0 :(得分:3)
我会说这实际上取决于特征的所需语义(等效:预期用途)。在某些情况下,您可能希望涵盖Foo<T>
上的“基于”,在其他情况下,只有Foo<T>
本身就是您所追求的。
单独使用名称,我可能会使用std::remove_cv
作为包装器。 const Foo<T>
仍然是Foo
的实例化。 Foo<T> &
绝对是不 - 它甚至不是类类型,它是一个参考。