【发布时间】:2017-01-19 21:38:57
【问题描述】:
我有一个作为类型特征的类,返回某个条件是否为真。它旨在将类标记为支持特定功能。
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 { };
错误:模板参数在偏特化中不可推导出:
是否有可能做到这一点,或者它是 C++ 的一个限制,你不能专注于内部模板类成员?
【问题讨论】:
-
不,错误是明确说明问题所在。这是一个限制,而不是您的建议。像
struct Check<typename Kitty<0>::Purr> : true_type { };这样的东西很好。 -
很明显,您的意思是要涵盖
Kitty::Purr的每个专业。但是考虑一下如果Kitty的特化没有Purr(template<> struct Kitty<0> {};) 会发生什么。该语言通过说您根本无法做到这一点来解决这个问题。在这种情况下,最好简单地忽略该专业化,或者以某种方式说每个专业化都必须符合该专业化,但是唉。您可能会做的是创建一个基类struct KittyBase { struct Purr; };并让Kitty继承它。需要Purr才能访问N?将Purr设为基础模板。
标签: c++ templates partial-specialization