C ++テンプレートを使用して作成されたクラス間でどのように変換する必要がありますか?

ドンターナー

私はテンプレートを持っていSoundRecording.hます:

template <typename T>
class SoundRecording {
public:
    explicit SoundRecording(T init);
private:
    T data;
};

template <typename T>
SoundRecording<T>::SoundRecording(T init){
    data = init;
}

そして、このテンプレートクラスのインスタンスを次のように作成できます。

SoundRecording<int16_t> recording(INT16_MAX);

に変換するrecordingための最良の方法は何SoundRecording<float>ですか?

簡単な方法を使用できることはわかっています。たとえば、次のように宣言できます。

SoundRecording<float> convertInt16ToFloat(SoundRecording<int16_t> input)

しかし、代入演算子またはコンストラクター演算子を使用してこれを実現するためのより洗練された方法があるかどうか疑問に思いました。

次のコメントを更新しました:明示的な変換を定義しようとしています。上記の例でrecording.dataINT16_MAX、構築後と同じです。に変換された後は、floatに等しくなり1.0Fます。

vsoftco

次のようなテンプレート化された変換演算子を使用できます

template<class U>
explicit operator SoundRecording<U>() { /*do the conversion here*/ }

テクニックを例示する最小限のコードスニペット:

template<class T>
struct X
{
    template<class U>
    explicit operator X<U>() {return {};}
};

int main()
{
    X<int> x;
    auto y = static_cast<X<float>>(x); // conversion
}

Live on Coliru

@Mooing Duckがコメントで述べているようexplicitに、厄介な不要なコンパイラトリガー変換を回避するように変換演算子をマークするようにしてください。

次のようにとの組み合わせを使用してTがに変換U可能である場合、またはその逆の場合にのみ、もう少し進んで変換を有効にすることができますstd::enable_ifstd::is_convertible

template<class U, 
         typename std::enable_if<std::is_convertible<T, U>::value>::type* = nullptr>
explicit operator X<U>() {return {};}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

switchステートメントを使用して変数からC ++テンプレートオブジェクトを作成する必要がありますか?

分類Dev

C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

分類Dev

C ++クラスがテンプレート基本クラスから派生しているかどうかを確認します。統合されたテンプレートパラメータがあります

分類Dev

Visual Studio 2017を更新し、コンパイルエラーC7510が発生するようになりました:「コールバック」:依存テンプレート名の使用には「テンプレート」をプレフィックスとして付ける必要があります

分類Dev

テンプレートを使用して、C ++で「using」(パラメーター化されたエイリアスの作成)でエイリアスを作成するにはどうすればよいですか?

分類Dev

C#のwpfプロジェクトの「キャッチまたはスローされたタイプはsystem.exceptionから派生する必要があります」エラーを修正するにはどうすればよいですか?

分類Dev

保護されたメンバーをC ++テンプレートクラス間で共有するにはどうすればよいですか?

分類Dev

Objective Cで、オンザフライで作成されたNSSetに対してメンバーシップをテストするためのよりクリーンな方法はありますか?

分類Dev

C#でJavaScriptを使用して作成されたテーブルをスクレイプするにはどうすればよいですか?

分類Dev

ファンクターがオプションではない場合、C ++でカスタム関数呼び出しを使用してテンプレート化されたRAIIラッパーを作成するにはどうすればよいですか?

分類Dev

C ++では、インスタンスをインスタンス化せずに、クラスのテンプレートに仮想デストラクタがあるかどうかをテストする(新しい)方法はありますか?

分類Dev

既存のオーバーロードされたマッピング関数を使用して、ClassAのリストをClassBに変換するジェネリック関数を作成するにはどうすればよいですか。(C#)

分類Dev

Azure B2C-個別の顧客ごとに1つのB2Cテナントを作成する必要がありますか、それともすべての顧客に1つのB2Cテナントを作成する必要がありますか?ベストプラクティスは何ですか?

分類Dev

C ++ 11可変個引数テンプレートを使用して、ベクトルのタプルに裏打ちされたタプルのベクトルを定義するにはどうすればよいですか?

分類Dev

C ++では、次のクラスまたは関数宣言にテンプレートパラメーターが表示されない場合、テンプレートパラメーターはどのように使用されますか?

分類Dev

WinFormsを使用してデータをプルすると、XMLはプレーンテキストに変換されます。XMLを維持する方法、またはC#に戻す方法はありますか?

分類Dev

C ++仮想クラスのテンプレート化された子からデータを取得するにはどうすればよいですか?

分類Dev

C ++の別のテンプレート関数でテンプレートクラスに属するネストされた型を使用するにはどうすればよいですか?

分類Dev

C#MongoDBドライバーを使用して、ネストされたオブジェクトのプロパティを等しくすることができない、強く型付けされたフィルターを作成するにはどうすればよいですか?

分類Dev

C#boolをfalseとして初期化する必要がありますか、それともelseステートメントでfalseにする必要がありますか?ベストプラクティス?

分類Dev

C#boolをfalseとして初期化する必要がありますか、それともelseステートメントでfalseにする必要がありますか?ベストプラクティス?

分類Dev

C ++テンプレートクラスを使用してテンプレート関数を呼び出すにはどうすればよいですか?

分類Dev

C ++テンプレートワイルドカードのような構成(または:テンプレートを使用してワイルドカードを作成するにはどうすればよいですか)

分類Dev

テンプレートタイプがC ++ 11の特定の基本クラスから派生しているかどうかをエレガントにチェックするにはどうすればよいですか?

分類Dev

基本クラスのフレンド関数が、プライベートであるにもかかわらず、派生クラスのオーバーライドされた仮想関数をどのように呼び出しているか?(C ++)

分類Dev

オブジェクトデータがc ++コンストラクターで間違った順序で初期化されている場合、どのようなバグが発生する可能性がありますか

分類Dev

ブートストラップの「プルセンター」:A -D- B -E-C列がABC // DEに折りたたまれています。DとEの間でBを取得するにはどうすればよいですか?

分類Dev

ExcelスプレッドシートをC#.Netインターフェイスに変換しようとしていますが、混乱する行があります。この行の背後にあるロジックを誰もが説明できますか

分類Dev

1つの文字列xmlがあり、それをクラスC#に変換したいのですが、どうすればよいですか?

Related 関連記事

  1. 1

    switchステートメントを使用して変数からC ++テンプレートオブジェクトを作成する必要がありますか?

  2. 2

    C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

  3. 3

    C ++クラスがテンプレート基本クラスから派生しているかどうかを確認します。統合されたテンプレートパラメータがあります

  4. 4

    Visual Studio 2017を更新し、コンパイルエラーC7510が発生するようになりました:「コールバック」:依存テンプレート名の使用には「テンプレート」をプレフィックスとして付ける必要があります

  5. 5

    テンプレートを使用して、C ++で「using」(パラメーター化されたエイリアスの作成)でエイリアスを作成するにはどうすればよいですか?

  6. 6

    C#のwpfプロジェクトの「キャッチまたはスローされたタイプはsystem.exceptionから派生する必要があります」エラーを修正するにはどうすればよいですか?

  7. 7

    保護されたメンバーをC ++テンプレートクラス間で共有するにはどうすればよいですか?

  8. 8

    Objective Cで、オンザフライで作成されたNSSetに対してメンバーシップをテストするためのよりクリーンな方法はありますか?

  9. 9

    C#でJavaScriptを使用して作成されたテーブルをスクレイプするにはどうすればよいですか?

  10. 10

    ファンクターがオプションではない場合、C ++でカスタム関数呼び出しを使用してテンプレート化されたRAIIラッパーを作成するにはどうすればよいですか?

  11. 11

    C ++では、インスタンスをインスタンス化せずに、クラスのテンプレートに仮想デストラクタがあるかどうかをテストする(新しい)方法はありますか?

  12. 12

    既存のオーバーロードされたマッピング関数を使用して、ClassAのリストをClassBに変換するジェネリック関数を作成するにはどうすればよいですか。(C#)

  13. 13

    Azure B2C-個別の顧客ごとに1つのB2Cテナントを作成する必要がありますか、それともすべての顧客に1つのB2Cテナントを作成する必要がありますか?ベストプラクティスは何ですか?

  14. 14

    C ++ 11可変個引数テンプレートを使用して、ベクトルのタプルに裏打ちされたタプルのベクトルを定義するにはどうすればよいですか?

  15. 15

    C ++では、次のクラスまたは関数宣言にテンプレートパラメーターが表示されない場合、テンプレートパラメーターはどのように使用されますか?

  16. 16

    WinFormsを使用してデータをプルすると、XMLはプレーンテキストに変換されます。XMLを維持する方法、またはC#に戻す方法はありますか?

  17. 17

    C ++仮想クラスのテンプレート化された子からデータを取得するにはどうすればよいですか?

  18. 18

    C ++の別のテンプレート関数でテンプレートクラスに属するネストされた型を使用するにはどうすればよいですか?

  19. 19

    C#MongoDBドライバーを使用して、ネストされたオブジェクトのプロパティを等しくすることができない、強く型付けされたフィルターを作成するにはどうすればよいですか?

  20. 20

    C#boolをfalseとして初期化する必要がありますか、それともelseステートメントでfalseにする必要がありますか?ベストプラクティス?

  21. 21

    C#boolをfalseとして初期化する必要がありますか、それともelseステートメントでfalseにする必要がありますか?ベストプラクティス?

  22. 22

    C ++テンプレートクラスを使用してテンプレート関数を呼び出すにはどうすればよいですか?

  23. 23

    C ++テンプレートワイルドカードのような構成(または:テンプレートを使用してワイルドカードを作成するにはどうすればよいですか)

  24. 24

    テンプレートタイプがC ++ 11の特定の基本クラスから派生しているかどうかをエレガントにチェックするにはどうすればよいですか?

  25. 25

    基本クラスのフレンド関数が、プライベートであるにもかかわらず、派生クラスのオーバーライドされた仮想関数をどのように呼び出しているか?(C ++)

  26. 26

    オブジェクトデータがc ++コンストラクターで間違った順序で初期化されている場合、どのようなバグが発生する可能性がありますか

  27. 27

    ブートストラップの「プルセンター」:A -D- B -E-C列がABC // DEに折りたたまれています。DとEの間でBを取得するにはどうすればよいですか?

  28. 28

    ExcelスプレッドシートをC#.Netインターフェイスに変換しようとしていますが、混乱する行があります。この行の背後にあるロジックを誰もが説明できますか

  29. 29

    1つの文字列xmlがあり、それをクラスC#に変換したいのですが、どうすればよいですか?

ホットタグ

アーカイブ