Тип Черты и const/volatile/&/&&&
Когда вы пишете класс черты, используя частичную специализацию шаблона, говорите
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 ответ
Я бы сказал, что это действительно зависит от желаемой семантики (эквивалентно: предполагаемое использование) черты. В некоторых контекстах вы можете охватить все, что "основано" на Foo<T>
только в других контекстах Foo<T>
сам то, что вы после.
Исходя из названия, я бы, наверное, использовал std::remove_cv
как обертка. const Foo<T>
все еще является экземпляром Foo
, Foo<T> &
определенно нет- это даже не тип класса, это ссылка.