0

コードのブロックを保存して後で使用しようとしているので、自動変数をグローバルとして宣言し、割り当ててから、ブロックを呼び出すことができます。

// In the header
auto __myblock; // error

それで:

__myblock=[]()
{
    <code>
};
<other code>
__myblock();

しかし、問題は構文エラーが発生することです:宣言した瞬間に変数を初期化する必要があるようですので、そのブロックを記憶して後で使用することはできません。ブロックをグローバル変数として記憶する必要がありますまたはクラス内。また、クラス内では、autoをインスタンス変数として宣言することは許可されていません。方法はありますか?

4

1 に答える 1

2

あなたの質問には2つの質問があります:

  1. 事前に(初期化前に)自動変数を宣言できますか?
  2. ラムダ関数を保存する方法

最初の質問に対する答えは「いいえ」です。自動変数の宣言は初期化に伴う必要があります。あなたが持つことはできません:

auto x;  // error
x = 42;

なぜなら、コンパイラは宣言でxがどうあるべきかを知らないからです。一方で:

auto x = 42;

42はintであるため、有効です。コンパイラはxに整数を割り当てます。

2番目の質問には、std::functionを使用します。可能な限り最適化されています。考慮すべき詳細がいくつかあります。具体的には、コードブロック<code>は、ラムダ関数のスコープ外の変数を参照します。含まれている場合は、それらの変数を値または参照で参照しますか。これらの変数はすべてどこかに格納する必要があり(キャプチャとも呼ばれます)、これがstd::functionの機能です。キャプチャがない場合、std :: functionは基本的に関数への単純なポインタであり、可能な限り最適化されています。ヘッダーには次のものがあります。

// with no capture:
std::function<void()> _myblock;

// if you have capture (say, two integers)
std::function<void(int,int)> _myblock

そしてソースで持っている:

// no capture:
_myblock = []() { <code> }

// with capture:
_myblock = [x,y]( int x, int y) { <code> }

最後に、コメント投稿者の1人が指摘したように、キャプチャがない場合は、<code>コードを関数に分解し、後で呼び出すのが最善の方法です。

于 2012-10-14T14:33:49.110 に答える