2013-05-08 9 views
6

usingステートメントをコンストラクタの初期化リストに組み込むにはどうすればよいですか?例えば、むしろusingステートメントは、コンストラクタの初期化リストに表示できますか?

foo::foo(int a, int b, int c) : a(a), b(b), c(something_long::tada(c)) {} 

より

私は

// Invoking some 'using something_long::tada;' magic 
foo::foo(int a, int b, int c) : a(a), b(b), c(tada(c)) {} 

を持っていると思いますおそらくこれは、このコード領域に必要な間抜けのtry/catch構文のようになります。機能的には、文を使用することを許可することは重要であると感じ、something_long::tada(c)using something_long::tada; tada(c)はKoenigルックアップごとに異なる動作をすることができます。

答えて

1

Very Gross Hackとして、2つの別々の実装ファイルを用意することができます。実装ファイルの1つは、以外)をコンストラクタ以外に実装する通常の実装ファイルです。コンストラクタをコンパイルするときに、第2の実装ファイルでは、あなたが

#include "appropriate-header-file" 
using namespace something_long; 

foo::foo(int a, int b, int c): a(a), b(b), c(tada(c)) {}; 

その方法を行うだろう、と、コンパイラはtadaを短くするusing宣言を持つことになります。ただし、これは標準実装ファイルの名前空間を汚染しません。

希望すると便利です。

+0

新しい機能で 'something_long :: tada(c)'をラップすることはありますか?静的な私的な機能のように。 – billz

+0

巧妙ですが、別のヘッダーファイルを作成するための余計な努力が実際に名前空間を入力する必要はありません。 – Yuushi

+0

@ Yuushi-これは原理的にこれを行うことが可能であることを示す概念の証明にすぎません。私は完全に同意するが! – templatetypedef

2

入力する必要がある名前空間のレベルの数によって異なります。あなたが名前空間のかなりの数のレベルを入力する必要がある場合は、静的関数でそれを埋めることができます:名前空間の多くのレベルが存在しない場合

class foo 
{ 
    //... 
    static int tada_again(int c) 
    { 
    return namespaceA::namespaceB::namespaceC::namespaceD::namespaceE::tada(c); 
    } 
    //... 
}; 

foo::foo(int a, int b, int c) : a(a), b(b), c(tada_again(c)) 
{ 
} 

ビューの維持またはコード読みやすさの観点から、入力する必要があります明確な名前空間を保つ方が良いでしょう。

+0

これはコンストラクタ内の簡潔さを提供しますが、Koenigルックアップを提供しません。 'tada(c)'ビットの上に 'namespaceA :: namespaceB :: etc;'行を追加して、私が何をしているのかを達成することができます。ありがとうございました。 –

3

名前空間エイリアスは役に立ちますか?

using SVLI = something::very::long::indeed; 

foo::foo(int a, int b, int c) : a(a), b(b), c(SVLI::tada(c)) {} 
+0

これは私の長さの苦情を乗り越えています。仮に 'c1'、' c2'、 'c3'は' c 'と同じように 'SVLI'を繰り返し使用すると言いますが、Koenigルックアップを提供しません。 –

関連する問題