[英]Templated class operator+ overloading return type
我正在嘗試構建一個模板化的 num 類。 這個類需要有一個公共屬性val
,類型為T
,這是唯一的模板化參數。 此外,如果提供了一個值,則屬性 ( val
) 應使用該值進行初始化。 為此,我編寫了以下代碼:
#include <iostream>
template<class T>
class Num {
public:
T val;
Num():val(0) { std::cout<<"default constr used"<<std::endl; }
Num(T value):val(value) {std::cout<<"constr (T value) used"<<std::endl; }
~Num() { std::cout<<"destructor used"<<std::endl; }
template<typename U>
Num operator+(const Num<U>& other) {
return val+other.value;
}
};
此外,我創建了main()
函數來測試程序,它看起來像這樣:
int main() {
std::cout << Num<int>(1) + Num<double>(2.0);
return 0;
}
然而,程序的結果現在是3
。 而我預計它是3.0
(類型為double
)。
為此,您需要更改返回類型。
在您的代碼中:
// vvv---- Means Num<T>
Num operator+(const Num<U>& other) {
return val + other.val;
}
實際上,在類模板中,您可以鍵入不帶模板參數的類的名稱,這在某種程度上相當於編寫Num<T>
。
無論加法本身的類型如何,您的函數始終返回第一個操作數的類型。
您想要的是從添加中推斷出該類型:
auto operator+(const Num<U>& other) -> Num<decltype(val + other.val)> {
return val + other.val;
}
這樣,根據 C++ 運算符規則,它始終是正確的返回類型。
operator+
應該關於它的參數是對稱的。 最好將其實現為自由函數而不是成員函數,以使這種對稱性明確。
例如(使用 C++14 返回類型推導):
template<class T, class U>
auto operator+(const Num<T>& x, const Num<U>& y) {
using R = decltype(std::declval<T>() + std::declval<U>());
return Num<R>{x.val + y.val};
}
如果T
和/或U
不是默認可構造的,則std::declval<T>()
用於泛型。 如果類型僅限於內置類型,例如int
和double
,則可以將其替換為T{}
或T()
:
using R = decltype(T{} + U{});
使用 C++17 中的類模板參數推導,它可以進一步簡化:
template<class T, class U>
auto operator+(const Num<T>& x, const Num<U>& y) {
return Num{x.val + y.val};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.