私は、特定の条件が真であるかどうかを返す、型特性として機能するクラスを持っています。クラスを特定の機能をサポートするものとしてマークすることを意図しています。テンプレートの内部型のクラスを特殊化する方法は?
template <typename T> struct Check : std::false_type { };
私は内部クラスを含むテンプレートクラスを持っている:
template <unsigned N>
struct Kitty
{
struct Purr;
};
は私がCheck
と表記機能をサポートするよう内部クラスPurr
をマークしたいです。つまり、Check<Kitty<123>::Purr>::value
がtrue
であるようにしたいと思います。私は次のことをやってみましたが、私はエラーを取得:
template <unsigned X>
struct Check<typename Kitty<X>::Purr> : std::true_type { };
error: template parameters not deducible in partial specialization:
それは、これを達成することは可能ですか、それはあなたが内側のテンプレートクラスのメンバーに特化することはできませんC++の制限ですが?
いいえ、エラーは問題の内容を明確に示しています。それはあなたの提案ではなく、限界です。 'struct check :: Purr>:true_type {};'のようなものは問題ありません。 –
DeiDei
[テンプレートの引数の控除がここで機能しないのはなぜですか?](http://stackoverflow.com/questions/1268504/why-is-the-template-argument-deduction-not-working-here) – LogicStuff
明らかですそれはあなたがカバーするキティ::プルのすべての専門化を意味します。しかし、 'Kitty'の特殊化に' Purr'( 'template <> struct Kitty <0> {};')がないとどうなるか考えてみてください。言語は、あなたが単にそれを行うことはできないと言ってこれを解決します。この場合、単にその専門化を無視するか、それともすべての専門化がそれに準拠しなければならないと言われてもいいでしょう。あなたができることは基本クラス 'struct KittyBase {struct Purr;}を作ることです。 };そして 'キティ'にそれを継承させる。 'N 'にアクセスするために' Purr'が必要ですか? 'Purr'をベースにテンプレートにします。 – chris