C ++テンプレートフレンド演算子と追加のテンプレート引数

トーマス・ハイアット

要素の数と要素の型をテンプレート引数として受け取るVectorクラスを作成しました。

template<int n, class T>
class Vector
{
    public:
        T data[n];

        Vector()
        : data{}
        {
        }

        Vector(T const value)
        {
            std::fill_n(data, n, value);
        }

        template<class ...U, typename std::enable_if<sizeof...(U) == n, int>::type = 0>
        Vector(U &&...u)
        : data{std::forward<U>(u)...}
        {
        }

        T& operator[](int const index)
        {
            return data[index];
        }

        template<class U>
        operator Vector<n, U>()
        {
            Vector<n, U> out;

            std::copy_n(data, n, out.data);

            return out;
        } 
};

クラスの演算子が必要ですが、異なる要素タイプのベクトル間で変換を行うには、クラス本体内で宣言および定義されたフレンド関数である必要があります。ただし、Vector 2、3、および4用に3つの特殊なテンプレートクラスも必要です。すべての演算子を4回、​​各クラス本体内に1回書き込む必要がないためです。この演算子を、右側のベクトルの要素タイプの追加のテンプレート引数と一緒に使用できますか?

template<int n, class T, class U>
inline Vector<n, T>& operator+=(Vector<n, T> &lhs, Vector<n, U> const &rhs)
{
    for(int i = 0; i < n; ++i)
    {
        lhs.data[i] += rhs.data[i];
    }

    return lhs;
}

こうするのではなく、クラス内で友達演算子を使うのには理由があるのか​​もしれませんが、今のところ問題ないようですが、何か見落としていませんか?

トニー・デルロイ

ここには、パーツの合計以外に何もありません。「friend」は、演算子が使用する可能性のある非公開メンバーへのアクセスを許可するために使用され、クラス内に定義を配置すると、入力が節約されます(暗黙的にインラインになり、単一定義規則の問題を回避します)。クラスをまとめる場合は、友達になる必要があるかどうかを考えるのを遅くすることなく、「友達...」演算子定義の入力を開始できます。クラス内に演算子をリストすることを好む人もいるかもしれません-誰かがクラスを調べて使用可能な関数を確認するときに、演算子が確実に表示されるようにします-しかし、プログラマーは通常、クラスの後に演算子を探すことに慣れています...。

コードが機能すれば、すべて問題ありません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C ++フレンド演算子テンプレートの特殊化

分類Dev

単項演算子と二項演算子を使用したテンプレートフレンド関数のC ++ 17とC ++ 20の違い

分類Dev

C ++テンプレート<演算子>

分類Dev

関数呼び出し演算子のC ++テンプレート

分類Dev

C ++クラステンプレートの継承と演算子=

分類Dev

テンプレートの引数としてのC ++テンプレート

分類Dev

C ++のテンプレート引数

分類Dev

C ++テンプレート内部クラスフレンド演算子のオーバーロード

分類Dev

テンプレート引数のC ++テンプレート引数

分類Dev

C ++演算子のオーバーロードテンプレートクラス

分類Dev

c ++-テンプレートクラスでオーバーロードするフレンド演算子

分類Dev

Abseil C ++テンプレート引数

分類Dev

C ++:テンプレート引数としての変数

分類Dev

C ++ 17で演算子!=テンプレート引数の存在を確認する方法は?

分類Dev

C ++テンプレートの完全ガイド。演算子の割り当て

分類Dev

テンプレートc ++は、一度に複数の演算子をオーバーロードします

分類Dev

C ++:テンプレート引数としての&(std :: cout)

分類Dev

C ++テンプレートクラスと演算子のオーバーロード

分類Dev

C ++ boost :: asio boost :: asio :: basic_socket_acceptor :: async_accept()の受け入れハンドラーの可変個引数テンプレート演算子

分類Dev

C ++テンプレートメタプログラミング:演算子のオーバーロード

分類Dev

可変個引数テンプレートからのC ++構造体フィールド名とタイプ

分類Dev

テンプレート引数としてのc ++メソッド

分類Dev

ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

分類Dev

演算子<< C ++のテンプレートクラスのメンバー型のオーバーロード

分類Dev

C ++のテンプレート引数として完全に指定されていないテンプレート

分類Dev

内部テンプレートクラスをC ++のテンプレート引数として渡します

分類Dev

c ++可変個引数テンプレートとテンプレートテンプレート引数:エラー:テンプレートパラメータリストの引数1でのタイプ/値の不一致

分類Dev

C ++テンプレート、メソッドとしてのデフォルト引数

分類Dev

C ++での代入演算子テンプレートとコピーコンストラクタ

Related 関連記事

  1. 1

    C ++フレンド演算子テンプレートの特殊化

  2. 2

    単項演算子と二項演算子を使用したテンプレートフレンド関数のC ++ 17とC ++ 20の違い

  3. 3

    C ++テンプレート<演算子>

  4. 4

    関数呼び出し演算子のC ++テンプレート

  5. 5

    C ++クラステンプレートの継承と演算子=

  6. 6

    テンプレートの引数としてのC ++テンプレート

  7. 7

    C ++のテンプレート引数

  8. 8

    C ++テンプレート内部クラスフレンド演算子のオーバーロード

  9. 9

    テンプレート引数のC ++テンプレート引数

  10. 10

    C ++演算子のオーバーロードテンプレートクラス

  11. 11

    c ++-テンプレートクラスでオーバーロードするフレンド演算子

  12. 12

    Abseil C ++テンプレート引数

  13. 13

    C ++:テンプレート引数としての変数

  14. 14

    C ++ 17で演算子!=テンプレート引数の存在を確認する方法は?

  15. 15

    C ++テンプレートの完全ガイド。演算子の割り当て

  16. 16

    テンプレートc ++は、一度に複数の演算子をオーバーロードします

  17. 17

    C ++:テンプレート引数としての&(std :: cout)

  18. 18

    C ++テンプレートクラスと演算子のオーバーロード

  19. 19

    C ++ boost :: asio boost :: asio :: basic_socket_acceptor :: async_accept()の受け入れハンドラーの可変個引数テンプレート演算子

  20. 20

    C ++テンプレートメタプログラミング:演算子のオーバーロード

  21. 21

    可変個引数テンプレートからのC ++構造体フィールド名とタイプ

  22. 22

    テンプレート引数としてのc ++メソッド

  23. 23

    ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

  24. 24

    演算子<< C ++のテンプレートクラスのメンバー型のオーバーロード

  25. 25

    C ++のテンプレート引数として完全に指定されていないテンプレート

  26. 26

    内部テンプレートクラスをC ++のテンプレート引数として渡します

  27. 27

    c ++可変個引数テンプレートとテンプレートテンプレート引数:エラー:テンプレートパラメータリストの引数1でのタイプ/値の不一致

  28. 28

    C ++テンプレート、メソッドとしてのデフォルト引数

  29. 29

    C ++での代入演算子テンプレートとコピーコンストラクタ

ホットタグ

アーカイブ