2016-08-28 8 views
1

私はテンプレートコンバーターを持つコンバーターコンストラクタを持つクラステンプレートを持っています。そのクラステンプレートの2つのパラメータを取る関数です。関数が変換コンストラクタを使用できるようにするには、このquestion/answerを参照しましたが、少なくとも1つの引数が明示的に構築されている場合にのみ関数を呼び出すことができると回答しています。暗黙的にすべての引数を指定して関数を呼び出すことができる他の方法はありますか?すべての関数引数のコンバージョンコンストラクタを持つクラステンプレート

これは、私が上記のリンクを参照した後に持っているものです。少なくとも引数LHSまたはRHSが明示的に型Xのある場合、これは動作し、私はそれが仕事をしたいの両方が型Tである場合でも、

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

}; 
+0

「と私はそれが両方ともタイプTの場合であっても仕事をしたいです」 ... mmmm ...あなたの仲間の一人が 'template:'テンプレートを置くとどうなるでしょうか? 'std :: logic_error(" Not allowed "); } 'あなたのコードに含めるヘッダの1つに? –

答えて

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

2番目のasXの目的はfuncの呼び出しを統一することですか?それとも私は誤解しましたか? – mkmostafa

+0

2番目の 'asX'は、1つの引数がすでに' X'であるとき(そして 'X 'を構築しないとき)にはコピーを避けるためです。 – Jarod42

関連する問題