2017-07-04 11 views
-2

テンプレート関数を実装する必要があります。テンプレート関数を実装すると、任意のコンストラクタを使用して任意のクラスのインスタンスを作成することができ、可能なパラメータはlvaluesとrvaluesの任意の組み合わせになります。 AとB - -任意のクラスインスタンスを作成するためのテンプレート関数を実装する方法は?

は、私は2つのクラス考えてみましょう次のとおりです。私は以下のようなものを実装しようとした

class A 
{ 
public: 

A(){} 


}; 

class B 
{ 
    A& a1; // I want to be able to call non-constant methods and modify object 
    const A& a2; // This I need only as const member 
    int i; //can be initialized with a temporary object 

    public: 

    B(A& a1_, const A& a2_, int i_) : a(a_), a2(a2_), i(i_) {} 
}; 

それだけで私は左辺値(名前付きオブジェクト)を使用できるようになると私は意志一時的なオブジェクトを渡すことはできません。 constキーワードを追加すると、問題が部分的に解決されますが、必要なオブジェクトを変更することができなくなります。

template <typename TType, typename ... TArgs> 
TType create(TArgs&... args) 
{ 
    return TType(args...); 
} 

私はこのような機能 'を作成' を使用したい:

int main() 
{ 
    A a1; 
    A a2; 
    //function takes both lvalue and rvalue 
    B b = create<B>(a1, a2, 1); 
} 

を誰かが可能な解決策を提案してくださいもらえますか?

+2

あなたが探している検索語は「完璧な転送」です。 –

答えて

2

アラン・ストークスによって上記のコメントとして、あなたは左辺値と右辺値の表現を受信するforwarding referencesを使用することができます。

template <typename TType, typename ... TArgs> 
TType create(TArgs&&... args) 
{ 
    return TType(std::forward<TArgs>(args)...); 
} 
0

誰かが解決策を提案できますか?

ちょっとしたタイプミスです。特に、const以外の引数をTArgs&としてcreate()関数に渡す必要はありません。コンパイラは、すでに最適なフィッティングの型(参照)と一致します。

class B 
{ 
    A& a1; // I want to be able to call non-constant methods and modify object 
    const A& a2; // This I need only as const member 
    int i; //can be initialized with a temporary object 

    public: 

    B(A& a1_, const A& a2_, int i_) : a1(a1_), a2(a2_), i(i_) {} 
     //^      ^^ 
}; 

template <typename TType, typename ... TArgs> 
TType create(TArgs... args) 
       //^Remove the reference here 
{ 
    return TType(args...); 
} 

int main() 
{ 
    A a1; 
    const A a2; 
// ^^^^^ 
    //function takes both lvalue and rvalue 
    B b = create<B>(a1, a2, 1); 
} 

完全にコンパイルされたバージョンlive hereを参照してください。また、エラーを修正することになる移動参照as stated in other answers/commentsを使用もちろん


aa1用タイプミス以外):

template <typename TType, typename ... TArgs> 
TType create(TArgs&&... args) 
{ 
    return TType(std::forward<TArgs>(args)...); 
} 

が他live exampleを参照してください。

+0

いずれかのタイプがコピーできない場合はどうなりますか? –

+0

@Alan型減算のためのコピーがないか、またはコンストラクタ初期化子リストの 'a1(a1_)'が別の方法で動作するのはなぜですか? – user0042

関連する問題