5

私は、一般的な構造体/クラスがある場合:組み込み型のようなアルティスティック操作の2つのテンプレート型を宣伝するにはどうすればよいですか?

template<typename T> 
struct Container 
{ 
    T value; 
    Container(const Value& value) : value(value) { } 
}; 

をそして私はそれらの2の操作を実行したい:

template<typename T, typename U> 
Container<T> operator+(const Container<T>& lhs, const Container<U>& rhs) 
{ 
    return Container<T>(lhs.value + rhs.value); 
} 

問題があることlhsは型である場合Container<int>rhsタイプがContainer<float>の場合、Container<int>が返されます。しかし、私がauto result = 2 + 2.0fをやるならば、resultfloatとなるでしょう。そのため、ビヘイビア型とカスタム型の間で動作が矛盾します。

したがって、operator+のオーバーロードを受け取り、Container<float>を返すようにしてください。C++が組み込み型で算術昇格を処理する方法とよく似ていますか?

+0

あなたはC++ 11を使用することはできますか? –

+0

@PiotrSkotnickiはい。 – Therhang

答えて

5

テンプレートの2つのタイプのいずれかを使用する限り、合計の結果にキャストを誘導する危険があります。例として、偶然目標タイプとしてintを選択した場合、合計がfloatになっても、選択したタイプにキャストダウンされます。

とにかく、C++ 11以降では、コン上記の例のようにdecltype指定に依存し(または少なくとも、次の場合Container::TContainer::U+オペレータが定義されているタイプであることができます)。

私はoperator+の戻り値としてauto指定子も使用しました。これはC++ 14以降の処理であり、本当に便利です。

言及した上でこれは、実施例を次に示します。

#include <iostream> 
#include <vector> 

template<typename T> 
struct Container 
{ 
    T value; 
    Container(const T& value) : value(value) { } 
}; 

template<typename T, typename U> 
auto operator+(const Container<T>& lhs, const Container<U>& rhs) 
{ 
    return Container<decltype(lhs.value+rhs.value)>{lhs.value + rhs.value}; 
} 

int main() 
{ 
    Container<int> c1{1}; 
    Container<float> c2{0.5}; 
    std::cout << (c1+c2).value << std::endl; 
} 
+1

よく見えます。 'make_container'ヘルパー関数を使うと、テンプレート引数を推測できるようになります。' return make_container(lhs.value + rhs.value); ' – hvd

+0

良い点、私は宿題として残しています...: - ) – skypjack

+0

'decltype'で実行された操作によって追加されたランタイムコストはありますか?結果を一時的な 'auto'変数に格納し、' return Container (result);のようなものを実行すればよいでしょうか? – Therhang

関連する問題