类型特征和 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 类型,它是一个引用。
当你使用部分模板特化编写特征 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 类型,它是一个引用。