次のクラスを考えてみましょう。内部構造体Y
が型として使用されています。テンプレートでは、後で:
template<int I>
class X{
template<class T1>
struct Y{};
template<class T1, class T2>
struct Y{};
};
さて、この例は明らかにコンパイルされません。2番目の例X<I>::Y
はすでに定義されているか、テンプレートパラメータが多すぎるというエラーがあります。
(余分な)部分的な特殊化なしでそれを解決したいと思います。int I
パラメーターは唯一のものではなく、その位置は異なる部分的な特殊化で異なる可能性があるためです(私の実際の構造体はこのように見えます、上記は単純化のためです質問)、それで私はone class fits every I
解決策が欲しいです。
私の最初の考えは明らかenable_if
にでしたが、それは私には失敗しているようです。それでも同じエラーが発生します:
// assuming C++11 support, else use boost
#include <type_traits>
template<int I>
class X{
template<class T1, class = std::enable_if<I==1>::type>
struct Y{};
template<class T1, class T2, class = std::enable_if<I==2>::type>
struct Y{};
};
したがって、enable_if
失敗するので、次のコンパイル時チェックを実行する別の方法があることを願っています。
template<int I>
class X{
__include_if(I == 1){
template<class T1>
struct Y{};
}
__include_if(I == 2){
template<class T1, class T2>
struct Y{};
}
};
コードの重複を大幅に節約するだけですが、どういうわけか可能であれば本当に嬉しいです。
編集:残念ながら、私はVisual Studio 2010を使用しているので、明白な可変個引数テンプレートを使用できません。そのため、そこでサポートされているC++0xのものだけを使用できます。:/