2016-08-28 61 views
1

我有一個具有模板類型轉換構造函數的類模板。還有一個函數,它接受該類模板的兩個參數。我提到question/answer以允許函數使用轉換構造函數,但答案指出,如果至少有一個參數是明確構造的,則只能調用該函數。有沒有其他的方法可以讓所有的參數隱含地構造函數?具有所有函數參數的轉換構造函數的類模板

所以這是我提到的鏈接後提到的。這工作如果至少參數LHS或RHS是X型的明確,我希望它即使雙方都T類型

template<typename T> 
class X { 
public: 
    X(T t) {} 
    friend void func(X lhs, X rhs) {} 

}; 
+0

「我想它的工作即使雙方都T類型」 ... mmmm ...如果你的一個夥伴會放一個'template func(U,U){throw std :: logic_error(「Not allowed」); }'在您的代碼中包含的其中一個頭文件中? –

回答

1

如果我正確理解您的問題,您可以添加超負荷工作:

template<typename T> 
class X { 
public: 
    X(T t) {} 
    friend void func(const X& lhs, const X& rhs) {} 
}; 

template <typename T> X<T> asX(const T& t) { return {t}; } 
template <typename T> const X<T>& asX(const X<T>& x) { return x; } 

template<typename LHS, typename RHS> 
void func(const LHS& lhs, const RHS& rhs) { return func(asX(lhs), asX(rhs)); } 

Demo

+0

第二個asX的目的是統一func的調用權嗎?還是我誤解了? – mkmostafa

+0

第二個'asX'是爲了避免在一個參數已經是'X'的時候複製(並且不能構造'X '')。 – Jarod42

相關問題