2011-01-06 35 views
3

私は、その値を計算するための2つのテンプレートパラメータに依存するテンプレート化されたクラスを持っていますが、それは構築用に1つだけです。私は生涯にわたる第二世代への依存を和らげたいと思います。私はテンプレートの静的関数を使用して値を計算し、次にインスタンスを作成することでこれを行うことを検討しています。このクラス内のメンバーはすべてconst POD型であり、アプリケーションの起動時にこのクラスの多くが作成されます。 一時的な一時参照の参照

template < class member > 
class FOO { 
public: 
FOO() : a(7) {}; 

template < class scope > 
static FOO CreateFOO() 
{ 
    return FOO(); 
}; 

private: 
const int a; 
}; 

template < class member, class scope > 
const FOO<member>* function() 
{ 
static const FOO<member>& temp = FOO<member>::CreateFOO<scope>(); 

return &temp; 
} 

int main() { 

const FOO<int>* b = function< int, int >(); 

return 0; 
} 

私は移動の意味を意図するが、私は単純に本当にそこのconst POD型を含むていますので、任意のスワップとコピーして破壊するだけで動いていないです。上記は合理的/有効ですか?私が読んだことはすべてそれが大丈夫だということを示唆している!これを行うより良い方法はありますか?

+3

template < class member > class FOO { public: template < class scope > FOO(scope); 

はその後、あなたのシングルトンのための標準的な形式を持っているでしょうconst型 'である。それがあなたを得ると思いますか? –

+0

私は右辺値にバインドできますか?コピーせずに? –

+0

新しいオブジェクトを値で返すと、コンパイラはコピーを最適化する必要がありますが、実際にはそれが保証されていません。私は、コピーが起こったときとそうでないときが予測できることを望む。 – Kos

答えて

2

これは問題ありません。参照tempは一時オブジェクトにバインドされているため、一時的なライフタイムはtempの生存期間に延長され、末尾はmain()です。

しかし、そこにリファレンスを使用する本当の理由はありません。なぜでしょうか:

{ 
    static const FOO<member> foo = FOO<member>::CreateFOO<scope>(); 
    return &foo; 
} 

あなたのコンパイラは、おそらくコピーコンストラクタを最適化する可能性があります。そうでない場合は、すべてのPODメンバーだと言っても大したことはありません。

いずれにせよ、static deinitialization order fiascoについて心配するかもしれません。あるいは、デストラクタから決して使用されないと確信しているかもしれません。

0

私はそれが人為的な例であることを理解しています。それでも、static FOO CreateFOO()が存在する理由はありません。この場合、オブジェクトをデフォルトで構築する以外は何もしません。あなたは、単にテンプレートコンストラクタを作成した場合:私は `静的定数のタイプ&`の代わりに `静的を使用するためのいずれかの根拠が表示されない

template < class member, class scope > 
const FOO<member>& function(scope your_scope) 
{ 
static FOO<member> temp(your_scope); 
return temp; 
} 
+0

私はシングルトンを作成するつもりはなく、FOO はスコープのコンテキストで作成されますが、スコープへの依存性は構築期間中のみです。私は多くのFOO をすべて異なるconst値で持つことができます。静的初期化関数は有効範囲内にありますが、FOO < member >はスコープ外でアクセスされます。また、FOO が範囲内に多数存在することがあります。私はこれが理にかなったことを望む:/ –

関連する問題