类型特征和 const/volatile/&/&&

Type Traits and const/volatile/&/&&

当你使用部分模板特化编写特征 class 时,比如

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的trait 会评估为 false。使用 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 是假的?

我想说这实际上取决于特征的所需语义(等同于:预期用途)。在某些情况下,您可能希望涵盖 Foo<T> 上的所有内容 "based",在其他情况下,您只需要 Foo<T> 本身。

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