2016-09-22 13 views
1

pair<double>,pair<float>,pair<int>のような2次元のポイント型を扱う必要があります。変換が存在する場合はいつでもポイント間の暗黙的な変換を許可したいと思いますそれらの座標。このような何かを:変換可能なタイプのペア/タプルへの型変換を拡張する

template< class From, class To > 
inline operator pair< To, To > (pair< From, From > that) 
{ 
    return make_pair(static_cast<To>(that.first), 
        static_cast<To>(that.second)); 
} 

残念ながら、g++オブジェクト:

convert.cpp:5:エラー: '演算子のはstd ::ペア(STD ::ペア)は、' 非静的メンバ関数

でなければなりません

pairのラッパークラスを定義する上記のw/outを行うことは可能ですか?

+0

番号を参照してください:double_point2d、float_point2d、int_point2dをし、適切な変換を提供しています。 (ここではテンプレートと考えるかもしれません) –

+0

変換関数は引数をとりません。あなたはそれを通常の(おそらく静的な)メンバ関数にすることができます。 – 0x499602D2

+0

ラッパーの代替手段は 'pair'から派生することですが、それを行うことにも多くの問題があります。私はあなたの演算子はメンバ関数としても暗黙的に動作しないと思います。なぜなら、戻り型のテンプレートパラメータは関数の引数から推論できないからです(暗黙的に 'static_cast ' 'T = pair ' 。最後に、暗黙的なキャストは通常​​は読みやすさを低下させるので、関数として保持する方がいいです( 'static_cast'を意味する場合を除いて)。 –

答えて

1

未知の型に暗黙的に変換することはできません。変換演算子は静的でないメンバ関数でなければなりませんが、それでもクラスをラップする必要があります。未知の型(テンプレート化されたコンストラクタとも呼ばれる)から変換コンストラクタを記述します。

あなたはそれフリー機能したくない理由:その後、

template<typename To, typename From> 
std::pair<To, To> convert(const std::pair<From, From>& p){ 
    return std::make_pair(static_cast<To>(p.first), 
       static_cast<To>(p.second)); 
} 

など、それを呼び出す:

std::pair<float, float> mp{3.424, 59.35}; 
auto p2 = convert<double>(mp); 

それができるようちょうど約として明らかです。参照してください。それLive on Coliru

EDIT
(OPさんのコメントを1として)

template<typename T> 
class Point{ 
public: 
    T x = T{}; 
    T y = T{}; 

    template<typename Y> 
    Point(Point<Y> p) : 
     x(static_cast<T>(p.x)), 
     y(static_cast<T>(p.y)) 
    { } 

    Point(T x_val, T y_val) : x(x_val), y(y_val) 
    { } 

    Point(Point&&) = default; 
    Point(const Point&) = default; 
    Point& operator = (Point&&) = default; 
    Point& operator = (const Point&) = default; 
}; 

doubleを使用してこの機能を考えてみましょう:

あなたはそういったことのための迅速なタイプを行うことができます型パラメータとしてPoint

void print(Point<double> p){ 
    std::cout << "(" << p.x << ", " << p.y << ")\n"; 
} 

以下のステートメントは、すべてコンバーターコンストラクターのために機能します。

int main() { 
    Point<float> mp{4.535, 395.3}; 
    Point<int> ip = mp; 
    print(mp); 
    print(ip); 
    return 0; 
} 

あなたがあなた自身のペア宣言することがあり、それはLive on Coliru

+0

私は残りのコードを 'convert'ステートメントで汚染したくないので、関数 'foo'が' pair と変数' bar'をとると 'pair 'と定義されます。 'foo(convert) ) '。 – Michael

+0

@Michael、あなたの唯一の方法は、クラスでそれをラップすることです。私の更新された答えを見てください。どうですか[これは(http://coliru.stacked-crooked。com/a/2ba0f23ce8ebe8dc) – WhiZTiM

関連する問題