6

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 ルックアップごとに異なる動作をする可能性があります。

4

3 に答える 3

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))
{
}

保守またはコードの読みやすさの観点から、入力する必要がある名前空間のレベルが多くない場合は、明確な名前空間を維持する方が適切です。

于 2013-05-08T03:37:18.393 に答える
1

Very Gross Hack としてできることの 1 つは、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)) {};

そうすれば、コンストラクターをコンパイルするときに、コンパイラーは短くするusing宣言を持ちます。tadaただし、これによって標準実装ファイルの名前空間が汚染されることはありません。

お役に立てれば!

于 2013-05-08T03:22:00.433 に答える