非型テンプレート構造体のメンバー構造体のコピー代入演算子をオーバーロードします

磁力計

次の非型テンプレートがあります。

template<size_t MAX_SIZE>
struct Path{
    struct Point{
        float x;
        float y;
       }
    };
    Point segment[MAX_SIZE];
};

ここで2つの異なるパスを宣言した場合、構造体は同じ構造であるがタイプが異なるため、異なるセグメントの要素を相互に割り当てることはできません。

Path<10> path_a ;
Path<30> path_b ;
path_a.segment[0].x = 1;
path_a.segment[0].y = 2;
path_b.segment[0] = path_a.segment[0]; // <- error C2679 in Visual Studio)

もちろん、ポイントとパスの定義を分離すると、割り当ては機能します。

struct Point{
        float x;
        float y;
       };

template<size_t MAX_SIZE>
struct Path{
    Point segment[MAX_SIZE];
};

しかし、それは私が望んでいることではありません(これは単なるMWEです)。そのため、コピー代入演算子をオーバーロードして機能させるにはどうすればよいか疑問に思いました。私は多くの変種を試しました、例えば:

template<size_t MAX_SIZE>
struct Path{
    struct Point{
        float x;
        float y;
        template<size_t OTHER_SIZE>
        Point & operator = (const typename Path<OTHER_SIZE>::Point & that)
        {
            x = that.x;
            y = that.y;
            return *this;
        }
    };
    Point segment[MAX_SIZE];
};

しかし、私はいつも同じエラーを受け取ります。だから私の質問は:構造体のレイアウトを変更せずに次のフォームの割り当てを可能にする方法で=をオーバーロードすることは可能ですか?

path_b.segment[0] = path_a.segment[0];
アンゲヴァンテはもはやSOを誇りに思っていません

はい、そのような設定は可能です。コアには、すべてのタイプを受け入れる代入演算子テンプレートが必要です。

template<class T>
Point & operator = (const T & that)

基本的な解決策としては、これで十分です。これで、メンバーがxありy互換性のあるタイプのすべてのタイプで機能し、そうでないタイプに対して(通常は)醜いエラーメッセージが生成されます。

それで十分であれば、完了です。

代入演算子の他のオーバーロードがある場合は、テンプレート1を選択的に無効にすることをお勧めします。このためには、Pointクラスをインストルメント化し、SFINAEを使用する必要があります

template<size_t MAX_SIZE>
struct Path{
    struct Point{
        float x;
        float y;
        struct EnableAssignment {};
    };
    Point segment[MAX_SIZE];
};

インストルメンテーションは次のように使用されます。

template<class T, class U = typename T::EnableAssignment>
Point & operator = (const T & that)

【簡略化した実例】


上記のコードは、C ++ 11でのみ導入された関数テンプレートのデフォルトのテンプレート引数を使用しています。その前に、他の方法でSFINAEを呼び出す必要があります。

template <class L, class R>
struct SfinaeThenRight
{
  typedef R type;
};

template <class T>
typename SfinaeThenRight<typename T::EnableAssignment, Point&>::type operator = (const T & that)

[簡略化されたC ++ 98の実例]

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレート構造体のオーバーロード演算子

分類Dev

テンプレート化された構造体の<<演算子をオーバーライドする

分類Dev

<<演算子のオーバーロード:構造体のベクトルを使用した構造体

分類Dev

テンプレート呼び出し演算子と汎用ラムダを使用した構造体のオーバーロード-gccvs clang

分類Dev

構造体の演算子のオーバーロード

分類Dev

C構造体をオーバーロードする演算子

分類Dev

テンプレート構造で定義されたメンバー構造の演算子<<をオーバーロード

分類Dev

構造体演算子のオーバーロードを宣言する場所

分類Dev

構造体メンバーのテンプレート関数

分類Dev

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

分類Dev

別の構造体内の構造体の演算子のオーバーロードはエラーを引き起こします

分類Dev

マップを使用した構造体のostream演算子のオーバーロード

分類Dev

構造体の特定のメンバーを整列/オフセットします

分類Dev

C ++の古い構造体演算子のオーバーロード構文が変更されましたか?

分類Dev

グローバル構造体のメンバーを更新しています

分類Dev

マップキーとしてのc ++構造体と演算子のオーバーロード

分類Dev

構造体の二項<<演算子をオーバーライドする

分類Dev

構造体のサイズと構造体メンバーのアドレス

分類Dev

構造体へのポインタを使用して構造体メンバーをループする場合

分類Dev

std :: vectorからコピー構造体メンバーを削除します

分類Dev

文字列を構造体メンバーにコピーする

分類Dev

std :: coutは、構造体のオーバーロードされた '<<'演算子では機能しません

分類Dev

算術演算子の構造体のメンバーを使用する方法(構造体メンバーに変数をadd、sub、mul、div)

分類Dev

算術演算子の構造体のメンバーを使用する方法(構造体メンバーに変数をadd、sub、mul、div)

分類Dev

演算子のオーバーロードの代わりにカスタムコンパレータ関数を使用して構造体のセットを作成する方法

分類Dev

テンプレートクラス/構造体のメンバー関数アドレスを関数パラメーターとして渡す

分類Dev

構造体メンバー配列のディープコピー

分類Dev

構造体メンバークロージャでコンテキスト変数を使用しますか?

分類Dev

Cの文字列メンバーを持つ構造体をコピーします

Related 関連記事

  1. 1

    テンプレート構造体のオーバーロード演算子

  2. 2

    テンプレート化された構造体の<<演算子をオーバーライドする

  3. 3

    <<演算子のオーバーロード:構造体のベクトルを使用した構造体

  4. 4

    テンプレート呼び出し演算子と汎用ラムダを使用した構造体のオーバーロード-gccvs clang

  5. 5

    構造体の演算子のオーバーロード

  6. 6

    C構造体をオーバーロードする演算子

  7. 7

    テンプレート構造で定義されたメンバー構造の演算子<<をオーバーロード

  8. 8

    構造体演算子のオーバーロードを宣言する場所

  9. 9

    構造体メンバーのテンプレート関数

  10. 10

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

  11. 11

    別の構造体内の構造体の演算子のオーバーロードはエラーを引き起こします

  12. 12

    マップを使用した構造体のostream演算子のオーバーロード

  13. 13

    構造体の特定のメンバーを整列/オフセットします

  14. 14

    C ++の古い構造体演算子のオーバーロード構文が変更されましたか?

  15. 15

    グローバル構造体のメンバーを更新しています

  16. 16

    マップキーとしてのc ++構造体と演算子のオーバーロード

  17. 17

    構造体の二項<<演算子をオーバーライドする

  18. 18

    構造体のサイズと構造体メンバーのアドレス

  19. 19

    構造体へのポインタを使用して構造体メンバーをループする場合

  20. 20

    std :: vectorからコピー構造体メンバーを削除します

  21. 21

    文字列を構造体メンバーにコピーする

  22. 22

    std :: coutは、構造体のオーバーロードされた '<<'演算子では機能しません

  23. 23

    算術演算子の構造体のメンバーを使用する方法(構造体メンバーに変数をadd、sub、mul、div)

  24. 24

    算術演算子の構造体のメンバーを使用する方法(構造体メンバーに変数をadd、sub、mul、div)

  25. 25

    演算子のオーバーロードの代わりにカスタムコンパレータ関数を使用して構造体のセットを作成する方法

  26. 26

    テンプレートクラス/構造体のメンバー関数アドレスを関数パラメーターとして渡す

  27. 27

    構造体メンバー配列のディープコピー

  28. 28

    構造体メンバークロージャでコンテキスト変数を使用しますか?

  29. 29

    Cの文字列メンバーを持つ構造体をコピーします

ホットタグ

アーカイブ