2016-11-11 10 views
13

私は次のようにクラスAを定義しように依存すべき:タイプは、コンストラクタの引数の型

ここ
template< typename T > 
class A 
{ 
    public: 
    A(T elem) 
     : _elem(elem) 
    {} 

    private: 
    TYPE _elem; // "TYPE" should be either "T" in case "elem" is an r-value or "T&" in case "elem" is an l-value. 
}; 

、私は_elemは、コンストラクタの引数elemがある場合にはタイプTのいずれかを持つようにしたいですr値またはタイプT&の場合、elemはl値です。

これはどのように実装できますか?

+1

私はあなたのためにこれを書くのに賢明ではありませんが、テンプレート*専門化*を使用してこれを達成します。注目を集めるためにアップアップ。 – Bathsheba

+0

私はこれも(ビュークラスを書くときに)必要がありました... –

答えて

12

我々はtemplate argument deduction for class templatesを取得するまでは、あなたがこのためにヘルパー関数を使用する必要があります:

template <typename T> 
auto make_a (T&& elem) { 
    return A<T>{std::forward<T>(elem)}; 
} 

これは、引数は左辺値または右辺値であると完全に転送することによってAを構築するかどうかを推測するために、転送の参照を使用しています議論。 intを例にとると、左辺値が渡された場合、Tint&になり、右辺値が渡された場合、Tintになります。

あなたAテンプレートは、単に次のようになります。

template< typename T > 
class A 
{ 
    public: 
    A(T elem) 
     : _elem(elem) 
    {} 

    private: 
    T _elem; 
}; 

あなたはmake_a友人を作り、あなたが唯一のファクトリメソッドから建設を許可したい場合は、コンストラクタのプライベートを作ることができます。

+0

なぜstd :: moveはAのコンストラクタで使用していますか? – themagicalyang

+0

@themagicalyangおっと、習慣。 – TartanLlama

+0

r値が渡されたとき、なぜTは 'int'でなく' int && 'なのでしょうか? –

関連する問題