У меня есть класс, который действует как черта типа, возвращая истинность определенного условия. Он предназначен для того, чтобы пометить классы как поддерживающие определенную функцию.
template <typename T> struct Check : std::false_type { };
У меня есть класс шаблона, который содержит внутренний класс:
template <unsigned N>
struct Kitty
{
struct Purr;
};
Я хочу пометить внутренний класс Purr
как поддерживающий функцию, обозначенную как Check
. Другими словами, я хочу сделать так, чтобы Check<Kitty<123>::Purr>::value
было true
. Я попытался сделать следующее, но я получаю сообщение об ошибке:
template <unsigned X>
struct Check<typename Kitty<X>::Purr> : std::true_type { };
ошибка: параметры шаблона не выводятся в частичной специализации:
Возможно ли это сделать, или это ограничение С++, что вы не можете специализироваться на членах класса внутреннего шаблона?
struct Check<typename Kitty<0>::Purr> : true_type { };
в порядке. - person DeiDei   schedule 20.01.2017Kitty::Purr
должна быть охвачена. Но подумайте, что происходит, если специализацияKitty
не имеетPurr
(template<> struct Kitty<0> {};
). Язык решает эту проблему, говоря, что вы просто не можете этого сделать. В таком случае было бы неплохо просто проигнорировать эту специализацию или как-то сказать, что каждая специализация должна ей соответствовать, но увы. Потенциально вы могли бы создать базовый классstruct KittyBase { struct Purr; };
и наследовать от негоKitty
. НуженPurr
для доступа кN
? СделатьPurr
шаблон в базе. - person chris   schedule 20.01.2017