1

私は C++0x コードではなく、通常の C++ に苦労しています。通常の C++ を使わなければならない理由を聞かないでください。

だからここにあります:いくつかのステートメントが真または偽であることに関して、列挙型の値を1または0にする必要があります。もちろん、列挙型に 0 を含む構造体をテンプレート化し、列挙型に 0 ではなく 1 を含む 2 番目のステートメントで特殊化しました。

私にはかなり正当に思えますが、専門化のパラメーターを使用する必要があることがわかります。可能な限りすべての方法で使用しようとしたため、このエラーが発生し続けたため、これはちょっと奇妙です。

コードは次のとおりです。

  template<typename T>
  struct CanPrint
  {
    template<size_t>
    struct Value               { enum { val = 0 }; };

    template<size_t>
    struct Value<sizeof(True)> { enum { val = 1 }; };

    enum
    { value = Value<sizeof(IsTrue<T>(0))>::val };
  };

部分的な特殊化でなければうまくいくと思いますが、明示的な特殊化は名前空間スコープではできません。そして明らかに、両方のテンプレートを特殊化せずにテンプレート内でテンプレートを特殊化することはできません。できますか?

4

2 に答える 2

3
template<>  //<---- leave it empty
struct Value<sizeof(True)> { enum { val = 1 };

ちなみに、Trueテンプレート引数でない場合は部分特化ではありません。完全特化です。

これは完全な特殊化であるため、クラス内、つまりクラススコープでは定義できません。完全な特殊化は、ネームスペース スコープでのみ定義できます。Valueそのため、名前空間のスコープで、プライマリと特殊化を定義します。

または、代わりにこれを行うことができます。

template<typename T>
struct CanPrint
{
    //modified
    template<typename U, size_t N = sizeof(U)> 
    struct Value { enum { val = 0 }; };

    //modified - now its partial specialization
    template<typename U>    
    struct Value<U, sizeof(True)> { enum { val = 1 }; };

    enum { value = Value<IsTrue<T> >::val }; //modified here as well
};

オンラインデモを見る: http://www.ideone.com/MSG5X

于 2011-06-18T08:41:07.680 に答える
2
template<> // note the empty <>
struct Value<sizeof(True)> { enum { val = 1 }; };

部分的な特殊化のパラメーターのみをリストします。

template< typename T, typename U> 
struct X;

template<typename U> 
struct X<char,U> {...};

template<typename Z, typename U> 
struct X<std::vector<Z>, U> {...};

完全なスペシャライゼーションではありません:

template<> 
struct X<double,int> {...};
于 2011-06-18T08:39:50.387 に答える