演算子のオーバーロードと異なるテンプレートパラメータ

user3428018

operator + iaテンプレートクラスのオーバーロードに問題があります。私が持っているとしましょう

template<typename T>
struct point{

    //Ctors:
    point(){};
    point(T _x, T _y):x(_x),y(_y){};
    point(const point<T>& p):x(p.x),y(p.y){};

    template<typename T2>
    point(const point<T2>& p):x(static_cast<T>(p.x)),y(static_cast<T>(p.y)){};



   //Coordinates:
   T x;
   T y;


   //Operator overloads:
   friend point<T> operator+(point<T> left,point<T> right ){
       return point<T>(left.x+right.x, left.y+right.y);
   }

   template<class T2>
   friend point<T> operator+(point<T2> left,point<T> right){
       return point<T>(left)+right;

   }

   template<class T3>
   friend point<T> operator+(point<T> left,point<T3> right){
       return point<T>(right)+left;
   }


};

これにより、呼び出し時にあいまいなエラーが発生します。

point<float> p1(1.2,1.4);
point<int> p2(1,2);    
point<float> p3 =p1+p2;    

これは理にかなっていますが、修正方法のグッドプラクティスを教えてください。

3人のオペレーターが必要です。そうしないと、キャストが間違った方向に進む可能性があります。たとえば、最後の演算子のオーバーロードを無視するp3.x=2とになりp3.y=4ます。

どうもありがとう!

乾杯とhth。-アルフ

ある程度、これは個人的な好みと主観的な意見の問題ですが、私は算術式の結果タイプの通常のC ++ルールをエミュレートしようと思います。

template <class T1, class T2 >
friend
auto operator+( Point<T1> const left, Point<T2> const right )
    -> Point< decltype( left.x + right.x ) > 
{
    return {left.x + right.x, left.y + right.y};
}

g ++ 4.8.2とVisualC ++ 12.0の両方を満たすことは、私が想像したよりも複雑であることが判明しましたが、これらのコンパイラーの両方でクリーンにコンパイルされる具体的なコードを次に示します。

#include <type_traits>
#include <utility>

template< class Number >
struct Point
{
    Number  x;
    Number  y;
};

template< class T1, class T2 >
auto operator+( Point<T1> const left, Point<T2> const right )
    -> Point< typename std::remove_const<decltype( left.x + right.x )>::type > 
{
    using Result_number =
        typename std::remove_const<decltype( left.x + right.x )>::type;
    using Result_point = Point< Result_number >;
    return Result_point{ left.x + right.x, left.y + right.y };
}

auto main()
    -> int
{
    Point<float> const  p1{ 1.2, 1.4 };
    Point<int> const    p2{ 1, 2 };
    Point<float> const  p3 = p1 + p2;
}

可能な絞り込み変換を容易にするためにPoint、次のような明示的な変換演算子メンバー関数を追加できます。

template< class Number >
struct Point
{
    Number  x;
    Number  y;

    template< class Other_number >
    explicit
    operator Point<Other_number>() const
    {
        return Point<Other_number>{
            static_cast<Other_number>( x ),
            static_cast<Other_number>( y )
            };
    }
};

呼び出すには、適切なキャストを使用します。たとえば、見かけのコンストラクター表記(上記の定義では、変換演算子を呼び出すキャストです)。

    Point<int> const    p4 = Point<int>( p1 + p2 );

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

非型テンプレートパラメータ[ブール演算子のオーバーロード]

分類Dev

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

分類Dev

クラスとintパラメータをテンプレートとして使用するC ++オーバーロード演算子+

分類Dev

複雑な演算子のオーバーロードとテンプレート

分類Dev

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

分類Dev

テンプレートパラメータがそれを提供する場合、条件付きで比較演算子のオーバーロードを提供します

分類Dev

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

分類Dev

演算子= C ++の異なるパラメータでオーバーロードしますか?

分類Dev

非型パラメータを持つC ++テンプレートクラス:割り当て演算子をオーバーロードする方法は?

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

テンプレートクラス演算子のオーバーロードに関するさまざまなエラーと警告の問題

分類Dev

`std :: ostream`演算子をオーバーロードするときにデフォルトの非タイプテンプレートパラメータを変更する方法はありますか?

分類Dev

C ++のテンプレートクラスのオーバーロード演算子ostreamが機能しない

分類Dev

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

分類Dev

スプレッド演算子Typescriptによるコンストラクターのオーバーロード

分類Dev

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

分類Dev

イテレータと符号なし整数のオーバーロード+演算子

分類Dev

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

分類Dev

Eigen :: Matrixのテンプレートオーバーロード演算子

分類Dev

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

分類Dev

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

分類Dev

列挙型パラメーターでテンプレートをオーバーロードするときのMSVCコンパイラエラー

分類Dev

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

分類Dev

フレンド関数= 2つの異なるクラスの演算子オーバーロード

分類Dev

標準ライブラリ演算子と競合することなく、関連するクラスのグループの演算子をテンプレートオーバーロードするにはどうすればよいですか?

分類Dev

マトリックステンプレートクラスの演算子* =と演算子+のオーバーロード

分類Dev

テンプレートのデフォルトタイプのオーバーロード演算子

Related 関連記事

  1. 1

    非型テンプレートパラメータ[ブール演算子のオーバーロード]

  2. 2

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

  3. 3

    クラスとintパラメータをテンプレートとして使用するC ++オーバーロード演算子+

  4. 4

    複雑な演算子のオーバーロードとテンプレート

  5. 5

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

  6. 6

    テンプレートパラメータがそれを提供する場合、条件付きで比較演算子のオーバーロードを提供します

  7. 7

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

  8. 8

    演算子= C ++の異なるパラメータでオーバーロードしますか?

  9. 9

    非型パラメータを持つC ++テンプレートクラス:割り当て演算子をオーバーロードする方法は?

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

    テンプレートクラス演算子のオーバーロードに関するさまざまなエラーと警告の問題

  14. 14

    `std :: ostream`演算子をオーバーロードするときにデフォルトの非タイプテンプレートパラメータを変更する方法はありますか?

  15. 15

    C ++のテンプレートクラスのオーバーロード演算子ostreamが機能しない

  16. 16

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

  17. 17

    スプレッド演算子Typescriptによるコンストラクターのオーバーロード

  18. 18

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

  19. 19

    イテレータと符号なし整数のオーバーロード+演算子

  20. 20

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

  21. 21

    Eigen :: Matrixのテンプレートオーバーロード演算子

  22. 22

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

  23. 23

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

  24. 24

    列挙型パラメーターでテンプレートをオーバーロードするときのMSVCコンパイラエラー

  25. 25

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

  26. 26

    フレンド関数= 2つの異なるクラスの演算子オーバーロード

  27. 27

    標準ライブラリ演算子と競合することなく、関連するクラスのグループの演算子をテンプレートオーバーロードするにはどうすればよいですか?

  28. 28

    マトリックステンプレートクラスの演算子* =と演算子+のオーバーロード

  29. 29

    テンプレートのデフォルトタイプのオーバーロード演算子

ホットタグ

アーカイブ