簡體   English   中英

模板類運算符+重載返回類型

[英]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>()用於泛型 如果類型僅限於內置類型,例如intdouble ,則可以將其替換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM