T値という1つの属性のみを含むクラス番号を作成しました。私は現在テンプレートについて学んでいるので、Tはデータ型です。私が達成したいのは、次のような計算を行うことです。
Number<int>(2) + Number<double>(1.2)
これまでのところ操作はできますが、2つの異なるデータ型があると失敗します。これまで私はこれを書いてきました:
//class template
template<class T>
class Number
{
public:
T value;
Number(T num1)
{
value = num1;
}
Number<T> operator + ( const Number<T> &other) const
{
return Number<decltype(value+other.value)> (value+other.value);
}
};
データ型が同じ場合にのみ算術演算を実行します。
質問:
これは私が自分で部分的に答えることができます。私は次の行を使用します:
Number<T> operator + ( const Number<T> &other) const
したがって、左側がタイプの場合int
。すべてのTはになりますint
。エラーが発生せずに変更する必要がある方法がわかりません。
編集:
制約は、テンプレートに1つの型引数しか含めることができないことです。
提案されているように、2つのテンプレートパラメーターを使用してフレンドoperator +を宣言するだけでなく、メンバー関数operator +のセカンダリテンプレートを配置することもできます。これにより、キャストプラスを実行できます。
template<typename T>
class Number
{
public:
T value;
Number(const T&num1)
{
value = num1;
}
template <typename X> auto operator + ( const Number<X> &other) const
{
auto c = this->value + other.value;
return Number<decltype(c)> ( c );
}
};
#include <iostream>
int main()
{
Number<int> n{2};
Number<double> a{3.4};
std::cout << (a+n).value << std::endl;
}
または、フレンド関数を使用することもできます(これはよりシンボリックな一貫性があると思います)。
template<typename T>
class Number
{
public:
T value;
Number(T num1)
{
value = num1;
}
Number& operator +=( const Number<T> &other)
{
this->value += other.value;
return *this;
}
};
template <typename T1,typename T2> auto operator+(const Number<T1>&a, const Number<T2>&b)
{
auto c = a.value + b.value;
return Number<decltype(c)>( c );
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加