2012-02-29 9 views
1

make_shared()は何かきちんとしたことをしていて、これはどういう仕組みですか... make_shared()はTのコンストラクタ。 これはどのように作動しますか?どのようにしてTのために利用可能なコンストラクタをコピーして検証する私自身のテンプレート関数を設計することが可能ですか?どうすればmake_sharedのようなテンプレートTの引数リストを複製できますか?<T>()

例:

#include <memory> 
#include <iostream> 
#include <string> 

using namespace std; 

class Department 
{ 
public: 
     string Name; 
     double Budget; 
     Department(const string& name, const double& budget); 
}; 

Department::Department(const string& n, const double& b) 
     : Name(n), Budget(b) 
{ 
     cout << Name << " : " << Budget << endl; 
} 

int main() 
{ 
     shared_ptr<Department> d = make_shared<Department>("Human Resources", 1000.0); 
     // shared_ptr<Department> d = make_shared<Department>(); NOT VALID 
     return 0; 
} 

make_sharedコンパイル時に上記を検証()。引数const文字列&とconst double &を使用します。自分のコードでこの動作をどうやって模倣することができますか?

+2

インスピレーションのために、関連するBoostヘッダーをご覧ください。 –

+0

http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Variadic-Templates-are-Funadic – BoBTFish

答えて

3

これは完全転送(std::forward())を使用して行われます。あなたはそれについてhereを読むことができます(次のページの解読を続けてください)。here

2

ここでは実際の検証はありません。 make_sharedは、 が受け取った引数が一致しない場合、コードをコンパイルすることを拒否するために、盲目的に に引数をコンストラクタに転送しようとします。

これは二つのことで達成される:可変長引数がmake_sharedも空(引数の 任意の長さのリストを受け入れていることを確認してください

  • 可変長テンプレート引数
  • 完璧転送

リスト)と完全な 転送は、それらの引数が任意のタイプであることを可能にします。

関連する問題