Вопрос, возникший в связи с недавно возникшим question about extended std::is_base_of
type trait.Техника для различения обычных параметров шаблона и параметров шаблона шаблона с использованием разрешения SFINAE
Есть ли метод, который позволяет различать между обычным параметром шаблона и шаблоном параметрами шаблона в современной C++ или его расширения (скажем, -std=gnu++1z
лязга ++/г ++)?
namespace details
{
template< /* ??? */ base >
struct is_derived_from;
template< typaneme base >
struct is_derived_from<base>
{
static std::true_type test(base *);
static std::false_type test(void *);
};
template< template< typename ...formal > base >
struct is_derived_from< /* ??? */ >
{
template< typename ...actual > // actual parameters must be here!
static std::true_type test(base<actual...> *);
static std::false_type test(void *);
};
} // namespace details
template< typename derived, /* ??? */ base >
using is_derived_from = decltype(details::is_derived_from< /* ? base<?> */ >::test(std::declval< typename std::remove_cv<derived>::type * >()));
В положительном случае это позволяет нам сделать некоторые из полезных признаков типа гораздо более мощным (например, STL-х std::is_base_of
).
Я думаю, что для этого требуется функция языка как «обобщенные типы имен», не так ли?
Вы не можете перегружать шаблоны классов. Я думаю, вы можете использовать перегрузку шаблонов 'constexpr'. –
@ T.C. Существуют ли фундаментальные различия между ними, которые мы можем использовать? – Orient
@ T.C. Вам не нужно 'constexpr', достаточно сделать перегрузочное разрешение внутри' decltype' без оценки. – Potatoswatter