2017-10-19 126 views
1

我有一個由兩個模板定義的類。定義從模板類到基於其他模板的原始類型的隱式轉換

template<typename A, typename B> my_class { 
private: 
    A value; 

public: 
    operator A() { 
     return this->value; 
    } 
}; 

我想定義模板中類和第一種類型之間的隱式轉換,但僅限於模板上特定的第二種類型。由於A是C++基元類型,因此我無法在該端定義轉換。我試圖std::enable_if這樣

operator typename std::enable_if<std::is_same<B, specific_B_type>::value, NumT>::type() { 
    return this->value; 
} 

,但我得到的編譯錯誤

Error C2833 'operator type' is not a recognized operator or type dimensional_analysis 

有沒有辦法做到這一點,而不必定義專門用於B = specific_B_type整個班級?

+0

不幸的是,我剛剛發現我的答案實際上並沒有工作......看起來,這會禁用整個類實例化,而不僅僅是操作符......你能不接受它,所以我可以刪除它嗎? :) – Knoep

+0

好的,發現另一個(更簡單)的解決方案。這仍然是你想要的嗎? – Knoep

+0

我目前正在使用你給出的第一個解決方案'template :: value,void> :: type>'。它似乎工作,但我可能沒有足夠徹底的測試。你最好的解決方案是什麼?提前致謝! – mbtg

回答

1

可以使用static_assert檢查,如果轉換應該被允許:

operator A() 
{ 
    static_assert(std::is_same<B, specific_B_type>::value, "No conversion possible");  
    return this->value; 
} 

然而,這意味着你不能有一個明確的轉換爲A,如果Bspecific_B_type。如果您需要,可以查看this有關基於模板參數添加和刪除成員的問題的答案。