doubleでテンプレートクラスを特殊化する方法は?

ガロ

次のように、特定の型と可変個引数型に依存するテンプレートクラスを記述します。

template<typename ConstType,typename...Inputs>
class ConstantTensor;

次に、別のクラスを作成します。これは通常、このように定義されwrong_typeます(必要なタイプを想定しますが、次の特殊化とは異なります)。

template<typename T>
class X{
public:
using type=wrong_type;
}

そして、私もこの種の専門分野を持っています:

template<typename ConstType,typename...Inputs>
class X< ConstantTensor< ConstType ,Inputs...>>
{
public:
using type=right_type;
}

私の問題は、型を定義してConstantTensor<ConstType,double>から使用したいX<ConstantTensor<ConstType,double>>::type場合、特殊化ではなく一般的なケースが呼び出されることです。だから私はのwrong_type代わりに取得しますright_typedoubleタイプに対処する必要があると思います...この問題を解決する理由と方法を教えてください。前もって感謝します。

編集:ここにコードのスニペットがあります、私はそれがうまくいくことを願っています:

class Scalar
{};


template<typename ConstType,typename...Inputs>
class ConstantTensor
{
  public:    
  constexpr ConstantTensor(const Inputs&...inputs)
  {}
};

template<typename ConstType,typename...Inputs>
constexpr auto Constant(const Inputs&...inputs)
{return ConstantTensor<ConstType,Inputs...>(inputs...);}

template<typename T>
class X{
public:
using type=int;
};

template<typename ConstType,typename...Inputs>
class X<ConstantTensor<ConstType,Inputs...>>{
public:
using type=char;
};

int main()
{
constexpr auto delta=Constant<Scalar>(2.0);
using type= X<decltype(delta)>::type; // this is int not char
}
max66

問題はそれです

constexpr auto delta=Constant<Scalar>(2.0);

あるconstexpr変数は、だからそれもconstです。

そうでdecltype(delta)はありませんConstantTensor<Scalar>が、ConstantTensor<Scalar> constです。

const部分的な特殊化宣言の追加確認できます

template<typename ConstType,typename...Inputs>
class X<ConstantTensor<ConstType,Inputs...> const>{ // <-- added const
public:
using type=char;
};

今、あなたはそれが得るtypeですchar

-編集-

OPは尋ねます

コードを複製せずに、constとnon constの両方のケースに対処するための短くてエレガントな方法はありますか?

エレガントかどうかはわかりませんが、私には十分に短いように思われます。次の部分的な特殊化を追加して、一種の自己継承を使用できます。

template <typename T>
class X<T const> : public X<T>
 { };

したがってX<ConstantTensor<Scalar> const>、から継承しX<ConstantTensor<Scalar>>ます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートサブクラスを特殊化する方法は?

分類Dev

クラス外で特殊化テンプレートメソッドを宣言する方法は?

分類Dev

テンプレートクラスで代入演算子を特殊化する方法は?

分類Dev

整数型自体で整数型のクラステンプレートを特殊化する方法は?

分類Dev

テンプレートクラス(すでに指定されている)でテンプレートメンバー関数を特殊化する方法は?

分類Dev

ベクトルのクラステンプレートを特殊化する方法は?

分類Dev

特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

分類Dev

テンプレートクラスでテンプレートメンバー関数を特殊化する方法は?

分類Dev

クラステンプレートの特殊化でコードの重複を回避する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

別のクラスをクラステンプレートの特殊化として使用する方法

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

クラスメンバーテンプレートの特殊化(およびクラステンプレートメンバーの特殊化)に異なるアクセス修飾子を設定することは可能ですか?

分類Dev

typescriptでジェネリッククラスのテンプレートタイプを特殊化する方法は?

分類Dev

別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

分類Dev

CRTPテンプレートクラスでfmtテンプレートを適切に特殊化する方法を理解できません

分類Dev

C ++-テンプレートクラスの特殊化に一般的なテンプレートのコードを含める方法はありますか?

分類Dev

クラステンプレートの内部クラステンプレートでテンプレートを特殊化する

分類Dev

派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

分類Dev

テンプレート クラス内のメソッドを特殊化する適切な方法

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認します

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認しますか?

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

分類Dev

テンプレートメンバー関数を特殊化する方法は?

分類Dev

クラステンプレートの特殊化で「期待される '>'」?

分類Dev

演算子を使用してテンプレートを特殊化する方法は?

Related 関連記事

  1. 1

    テンプレートサブクラスを特殊化する方法は?

  2. 2

    クラス外で特殊化テンプレートメソッドを宣言する方法は?

  3. 3

    テンプレートクラスで代入演算子を特殊化する方法は?

  4. 4

    整数型自体で整数型のクラステンプレートを特殊化する方法は?

  5. 5

    テンプレートクラス(すでに指定されている)でテンプレートメンバー関数を特殊化する方法は?

  6. 6

    ベクトルのクラステンプレートを特殊化する方法は?

  7. 7

    特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

  8. 8

    テンプレートクラスでテンプレートメンバー関数を特殊化する方法は?

  9. 9

    クラステンプレートの特殊化でコードの重複を回避する方法

  10. 10

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  11. 11

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  12. 12

    別のクラスをクラステンプレートの特殊化として使用する方法

  13. 13

    C ++テンプレートの特殊化に基本クラスを追加する

  14. 14

    C ++テンプレートの特殊化に基本クラスを追加する

  15. 15

    クラスメンバーテンプレートの特殊化(およびクラステンプレートメンバーの特殊化)に異なるアクセス修飾子を設定することは可能ですか?

  16. 16

    typescriptでジェネリッククラスのテンプレートタイプを特殊化する方法は?

  17. 17

    別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

  18. 18

    CRTPテンプレートクラスでfmtテンプレートを適切に特殊化する方法を理解できません

  19. 19

    C ++-テンプレートクラスの特殊化に一般的なテンプレートのコードを含める方法はありますか?

  20. 20

    クラステンプレートの内部クラステンプレートでテンプレートを特殊化する

  21. 21

    派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

  22. 22

    テンプレート クラス内のメソッドを特殊化する適切な方法

  23. 23

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  24. 24

    クラスがテンプレートの特殊化であるかどうかを確認します

  25. 25

    クラスがテンプレートの特殊化であるかどうかを確認しますか?

  26. 26

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

  27. 27

    テンプレートメンバー関数を特殊化する方法は?

  28. 28

    クラステンプレートの特殊化で「期待される '>'」?

  29. 29

    演算子を使用してテンプレートを特殊化する方法は?

ホットタグ

アーカイブ