簡體   English   中英

c ++用於模板類的用戶定義運算符的隱式轉換

[英]c++ implicit conversion on user-defined operator for template classes

我有一個結構模板A<x>和一個帶有int+運算符。

#include <iostream>
template<int x>
struct A{
    int a;  
};
template<int x>
int operator+(A<x> a, int b){
    return a.a+b;
}

我創建了一個結構模板B<x> ,它可以轉換為A<x>

template<int x>
struct B{
    int b=3;
    operator A<x>(){
        return {b+10};
    }
};

現在我想B<x>轉換為A<x>呼叫時B<x> + int

int main(){
    std::cout<<(A<12>{9}+10)<<std::endl;//OK
    std::cout<<(B<12>{9}+10)<<std::endl;//Error
    return 0;
}

在重載模板類的運算符時讀取了隱式轉換並寫了

template<int x>
struct B{
    int b=3;
    operator A<x>(){
        return {b+10};
    }
    friend int operator+(A<x> a, int b);
};

,但它不起作用,因為聲明的friend int operator+(A<x> a, int b)template<int x> int operator+(A<x> a, int b) friend int operator+(A<x> a, int b)不匹配。

我讀了C ++ - 如何為類模板聲明一個函數模板的朋友並制作好友聲明模板,但它不起作用,因為無法推導出模板參數。

當然我可以為A和B編寫operator +,但我有幾十個運算符,我不想這樣做。

這樣做的正確方法是什么?

看看為A創建一個非成員operator+的兩種方法,我們可以將它作為一個函數模板:

template <int x>
int operator+(A<x>, int);

這與B<x>不匹配,因為我們只是進行模板推導,不允許進行轉換。

或者,我們可以使它成為非模板的朋友:

template <int x>
struct A {
    friend int operator+(A a, int );
};

它也不會與B<x>匹配,因為名稱查找不會考慮該函數。 除非,即我們告訴它:

template <int x>
struct B {
    friend int operator+(A<x>, int ); // NB: not a template
};

現在 ,將考慮我們的原始非模板operator+將根據需要執行轉換,並且您的代碼打印29。

您可能已經看過這個,但至少仍然可以進行顯式轉換,它可能很有用:

int main(){
    std::cout<<(A<12>{9}+10)<<std::endl;                     // prints 19
    std::cout<<(static_cast<A<12>>(B<12>{9})+10)<<std::endl; // prints 29
    return 0;
}

我希望它可以幫助你。

我有模板化的朋友operator+

派生自A<x>並編譯,但在調用friend operator+變量后, a是uninit所以我得到了立即值。 你必須設置a不知何故,這似乎工作。

#include <iostream>

template<int x>
struct A
{
    int a{x};
};

template<int x>
int operator+(A<x> a, int b)
{
    return a.a+b;
}

template<int x>
struct B : A<x>
{
    int b;

template<int U>
    friend int operator+(A<U> a, int b);
};

int main(void)
{
    std::cout<< (A<20>{}+10)<<std::endl; // prints 30
    std::cout<< (B<10>{}+10)<<std::endl; // prints 20
    return 0;
}

我嘗試使用以下(runnable)代碼編輯Barrys回答,這會生成正確的輸出,但在那里被拒絕了。

我會在這里添加它以防萬一其他人好奇。

#include <iostream>

template <int x>
struct A {
    int a;
    friend int operator+(A a, int b) { return a.a + b; }
};

template <int x>
struct B {
    int b;
    operator A<x>() { return {b+10}; }
    friend int operator+(A<x>, int );
};

int main() {
    std::cout << (A<12>{9} + 10) << std::endl;
    std::cout << (B<12>{9} + 10) << std::endl;
}

哪個打印

19
29

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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