Тип Черты и 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> & определенно нет- это даже не тип класса, это ссылка.

Другие вопросы по тегам