は、私はこの機能を持っていると言いますか?私は心配しています。move()
またはforward()
は通常、a...
がlvaluesなので、明示的に行う必要があります。それらを転送/移動するためにタプル仲介が必要ですか?もしそうなら、インデックストリックを使わずにタプルをパラメータパックに解凍する簡単な方法がありますか?転送または移動によってパラメータパックを取得する方法はありますか?</p> <pre><code>template <typename ...A> void test(A&& ...a) { [=]() { }; } </code></pre> <p>はラムダに転送するか、単に値によってコピーされようとしてパラメータパックです:
答えて
std::bind
で実行できる残りの有用な機能の1つです。キャプチャがbind
によって実行され、キャプチャされる値は、キャプチャレスジェネリックラムダに引数として渡されます。このGCCはとの問題を持っていると思わ
template <typename... A>
auto test(A&&... a)
{
auto f = [](auto&&... a)
{
// use a...
};
return std::bind(f, std::forward<A>(a)...);
}
クランと上記の作品が、偽volatile
修飾子。
template <typename... A>
auto test(A&&... a)
{
auto f = [](auto&&... a)
{
// use a...
};
return [f, tup = std::make_tuple(std::forward<A>(a)...)]() mutable { std::apply(f, tup); };
}
:
私たちは、最初のラムダのパラメータリストにタプルをアンパックするstd::apply
(C++ 17)を呼び出し、二ラムダでtuple
をキャプチャすることによりbind
せずにそれを行うことができますClangとGCCで動作します。 apply
は、あなたが避けたいインデックスのトリックで実装されていますが、あなたはそれにさらされていません。 mutable
は、2番目のラムダの呼び出し演算子が非constなので、タプル要素はconst
の資格を得ることになりません。
1つの方法は、ハスケルの意味でファンクタを書くことです。まあ、非常にばかではないvariaryicものです。
署名(Ts...)->(((Ts...)->X) -> X)
の機能を記述します。つまり、パックを取り、関数を返す関数です。返された関数は、そのパックを取り出して評価する関数を取ることができます。
template<class...Ts>
auto make_functor(Ts&&...ts); // TODO
これが済むと、簡単に問題を解決できます。
template<class ...A>
auto test(A&& ...a) {
return [unpack_a=make_functor(std::forward<A>(a)...)]() mutable
{
return unpack_a([&](auto&&...a){
// here you have access to a...
return sizeof...(a);
});
};
}
test
パックを取り、(まあ、パックと何もしない)、そのパックのサイズを返す関数を返します。
make_functor
は簡単ではありません。基本的には、手動でラムダを書いて、タプルにargsを格納し、operator()で索引をトリックします。
実際には、をのマニュアル擬似ラムダクラスに格納して解凍し、後で再利用します。
2番目の考えでは、タプルをとり、保存してから遅れてstd::apply
を使用する遅延適用を書くほうがよい場合があります。
template<class...Ts>
auto delayed_apply(std::tuple<Ts...> tup){
return [tup=std::move(tup)](auto&&f)->decltype(auto) mutable{
return std::experimental::apply(decltype(f)(f), std::move(tup));
};
}
これにより、パラメータの値/精度が失われることはありません。
template<class ...A>
auto test(A&& ...a) {
return [unpack_a=delayed_apply(std::forward_as_tuple(std::forward<A>(a)...))]() mutable
{
return unpack_a([&](auto&&...a){
// here you have access to a...
return sizeof...(a);
});
};
}
これには、std::experimental::apply
が必要です。
あなたは店右辺値にしたいと参照として左辺値のままにした場合:
unpack_a=delayed_apply(std::tuple<A...>(std::forward<A>(a)...))
を使用すると、両方のLとRの値を格納する場合:
unpack_a=delayed_apply(std::make_tuple(std::forward<A>(a)...))
この方法、あなたが見ることができるように多くの制御を与える。
std::experimental::apply
が必要な場合は、リファレンス実装があります。スマートフォンに書き込むものより優れています。
make_functor
はdelayed_apply
で書くことができますが、逆は真ではありません。
混乱している場合は、unpack_a
がラムダを取り、unpack_a
を作成するために使用されたタプルをアンパックします。基本的には、パック全体である1つのオブジェクトを格納し、ラムダ本体の内部に必要なときに展開します。
アンパックが「複数回」sometimssと「1回だけ」他の時間動作するようにするには、constとnon-const、さらにはrvalueオーバーロードの両方を処理するより長いdelayed_apply
が必要な場合があります。ラムダではなく、クラスを返す必要があります。煩わしい。私が思うに、コンパイルしていないコード例を作成しました。
フォーティナルにこの種のものは、一度だけ書いてあります。
これは内部転送が必要ですか? 'std :: forward_as_tuple(std :: forward (a)...)' – coyotte508
@coyはユースケースによって異なります。場合によっては時にはそうではありません。 – Yakk
なぜ値渡しですか?転送はトップファンクションにのみ行われます。
はのは、あなたの関数は、そこから
void test(int,string&,float&&)
{
[=]()
{
};
}
のように匿名ラムダ値によって意志コピーint
、string&
とfloat&&
を見ていきますので、あなたは、例えばint
、std::string&
とfloat&&
を渡しましょう。参照のコピーはまだコピーです。 tuple
を使用して引数を再度パックし、ラムダの中にそれらを解凍することができます。
ラムダの内部でタプルを使用する方法は?
- 我々は通常、可変長引数テンプレートと
- を行うようにまず完璧にタプルで引数を取り込む
はい、しかし、 'get <>()'へのインデックスなしで解凍する方法 – user1095108
参照のコピーは、このコンテキストの値であり、もはや参照ではありません。そして、このコピーはコピーによって生成され、rvaluesからの移動ではありません。 – Yakk
@Yakkあなたは正しいです、私はそれを削除しました –
をstd::apply
のいくつかの非標準の実装を見つけてanotehr機能の引数としてタプルを使用する再帰を使用します転送:あなたの後の関数呼び出しではタプルを解凍しhttps://stackoverflow.com/a/7858971/835629:
template <typename ...A>
void test(A&& ...a)
{
[tup= std::tuple<A...>(std::forward<A>(a)...)]()
{
//tup should contain the forwarded elements
};
}
は次にこの回答を使用しています。
//utils
template<int ...>
struct seq { };
template<int N, int ...S>
struct gens : gens<N-1, N-1, S...> { };
template<int ...S>
struct gens<0, S...> {
typedef seq<S...> type;
};
template<typename F, typename T, int ...S>
void unpackTupleToFunction_utils(F func, const T &tup, seq<S...>) {
func(std::get<S>(tup) ...);
}
template<typename F, typename ...Args, int ...S>
void unpackTupleToFunction(F func, const std::tuple<Args...> &tup) {
unpackTupleToFunction_utils(func, tup, typename gens<sizeof...(Args)>::type());
}
そして最終的にそれで関数を呼び出すために、ラムダの内側にタプルを解凍するには:
template <typename ...Args>
void test(Args&& ...a) {
auto lambda = [tup= std::tuple<Args...>(std::forward<Args>(a)...)]()
{
unpackTupleToFunction(f, tup);
};
lambda();
lambda();
lambda();
}
PS:それは[a = (std::forward<Args>(a)...)](){};
のようなものがコンパイルされないのは残念です。
はい、はい、しかしインデックストリックは私が避けようとしているものですが、あなたは完全に正しいです。 – user1095108
- 1. 転送参照のconstnessを表現するにはどうすればよいですか?この場合、</p> <pre><code>template<typename T> void f(T&& t) { ... } </code></pre> <p><code>f</code>のいずれか<code>f</code>の引数のタイプに応じて、左辺値参照、または右辺値参照を取ります
- 2. 適切なストレージ値のタイプを取得していますか?</p> <pre><code>struct Base {} template<typename T> struct Box : Base { template<typename... Args> Box(Args&&... args) : t(forward<Args>(args)...) {} T t; } </code></pre> <p>をそして、我々は関数MakeBoxがあります:
- 3. が動作していないよう<code>"a b"</code>から<code>"a b"</code></p> <pre><code>ssr["a b";"[ ]+";" "] </code></pre> <p>に取得するにはKDB +/Q
- 4. 私は<code>applicationWillTerminate</code>方法に<code>NSURLConnection</code>経由<code>NSURLRequest</code>を送信しようとしているapplicationWillTerminate
- 5. LaTexのマクロは、LaTexをMathで人間にとってよりフレンドリーにするためのマクロですか?名詞がでないように私は、各</p> <ol> <li>\と言葉によってを置き換えLaTeXのマクロを作る「と」</li> <li>\または単語によって「または」</li> </ol> <p>するにはどうすればよい
- 6. <:<はどのように動作しますか?
- 7. 送信ボタンをボタンのように見せないようにするにはどうすればよいですか?</p> <pre><code><button name ="sort" value="sort" type="submit">▼</button> </code></pre> <p>ボタンは、「ボタン」のようになります。私のフォームで
- 8. は、どのように私は</p> <pre><code>@PreAuthorize("(@assessmentAuthService.canViewAssessment(#id))") </code></pre> <p>AssessmentAuthServiceがスプリングによって自動的に作成されたWebリクエストを確保するために@PreAuthorizeを使用しています
- 9. ファイルリダイレクトVS.</p> <pre><code>while(<>){ print; } </code></pre> <p>と私はこのようにリダイレクトしてファイルに渡す必要があります考えています:<code>./sort.pl < wordlist</code>を、それが持っている私はそうのようないくつかのファイルからSTDINにかかる<code>sort.pl</code>という名前のperlスクリプトを持って
- 10. は、私は、このLinuxのコマンドは、私はそれが<strong>OD -c</strong>に<strong>LS</strong>を送信しています知っている</p> <pre><code>ls | od -c </code></pre> <p>を行うかを理解しようとしている
- 11. は、どのように私は<code>string</code>あるこの</p> <pre><code>var alldest = cc.returnallfullDestinations(mainElement).Split('|'); </code></pre> <p><code>returnallfullDestionations</code>のようなデータを取得していますC#
- 12. 私はコードの下に使用して試してみました</p> <pre><code>@Document(indexName="Something",type="type") </code></pre> <p>で動的に<code>indexname</code>を取得しようとしています@Document
- 13. は2角度 -</p> <pre><code><a [routerLink]="[/Person']">Person</a> </code></pre> <p>、私は以下のように<code><a></code>タグを持っているルート
- 14. IDのリストに従ってEFによって返されたオブジェクトをソートするにはどうすればよいですか?</p> <pre><code>User { PK: UserId ... } Product { PK: ProductId, FK: UserId ... } </code></pre> <p>私はランダムな形式で<code>ProductId</code>のリストを持っている:
- 15. オブジェクトリテラルのプロパティに直接アクセスすると、SyntaxErrorがスローされるのはなぜですか? <code>{}</code></p> <pre><code>{}.a </code></pre> <p>が、私はエラーを取得するには、オブジェクトのプロパティ<code>a</code>にアクセスしようとすると
- 16. 認識されていないセレクタはインスタンスに送信 - 私は単にコードの<strong>ハイライト</strong>ラインに<code>TableView</code>の<code>cell</code>に<code>NSMutableArray</code>を充填することによって、このエラーを取得してい分析
- 17. のstd ::機能とstd :: <code>std::packaged_task</code>が<code>void operator()(ArgTypes... args)</code>をオーバーロードしていますので、私は、<code>std::function<void()></code>の<code>std::vector</code>に<code>std::packaged_task</code>を移動しようとしていますpackaged_task変換
- 18. は、どのように私は戻ってきたものを疑問に思って</p> <pre><code>ostream& operator<< (ostream& os, const unsigned char* s); </code></pre> <p>のような関数宣言の関数のostream&演算子<<(ostreamに&OS、のconst unsigned char型の* s)を
- 19. どのような変数がxslで大きいか確認するには?に事業者、および<(& LT);</p> <pre><code><xsl:if test="$a > $b"> </code></pre> <p>は>(& GT)の文字エンティティを使用してみてください:
- 20. <<を使用してクラスにファイルオブジェクトを供給するためにoperator <<を使用するにはどうすればよいですか?
- 21. pythonスクリプトとセレニウムを使ってhrefリンクをクリックするには?私は、このような</p> <pre><code><a href="publications.html">Publications</a> </code></pre> <p>などの特定のhrefをクリックするセレンを取得しようとしています
- 22. 修正ポイント機能は<code>Control.Monad.State</code>、<code>fix :: (a -> a) -> a</code>から、私は<code>modifyValue</code>にこの小さなコードを持って、<code>fix</code>機能を理解するよう
- 23. は、どのように私はフォルダが</p> <p>今基本的に今私は<code>tomhome</code>から<code>/home/tom</code>にすべてのデータをコピー<code>/data/tomhome</code>と呼ばれる持って、私は私の別のpartioionに</p>その後 <pre><code>/home/tom </code></pre> <p>のように私のホームディレクトリを持っているのlinux
- 24. なぜGCCはプライベートネストされたクラスから継承を許可していますか?プライベート入れ子になったクラスです<code>A::B</code>から</p> <pre><code>class A { class B {}; }; template <typename C> class D : A::B {}; void f() { D<int> d; } </code></pre> <p><code>D<int></code>継承:
- 25. htmlツリーをjqueryを使ってカスタマイズしたjsonツリーに変換するには?今のよう</p> <pre><code>{"&&":[{'||':[ {'&&':[ {"lhs": "1", "comparator": "==", "rhs":"1"} ]} ] } , {"lhs": "1", "comparator": "!=", "rhs":"0"}]} </code></pre> <p>から
- 26. 私は<strong>のHashMap</strong>に<strong>キー(restaurant_id)</strong>と<strong>値(ORDER_ID)</strong>を追加しようとしています
- 27. Gitは<<<<<<< HEADをファイルに追加し続けます
- 28. RAPT:私のJDKには何が間違っていますか?</p> <pre><code>python android.py installsdk </code></pre> <p>それは通常返します:質問は、私はいくつかのトラブルのコマンドを実行するためにうっとりを得る持って言うよう
- 29. どのように私は私が始まるかどうかによってフィルタリングするbashの配列</p> <pre><code>X=("a" "b c" "-d" "k j", "-f") </code></pre> <p>があるとbashの配列
- 30. Fat Free PHP:intを使って繰り返す方法は?</p> <pre><code><repeat group="{{ @totalIterations }}" value="{{ @i }}"> {{ @i }}<br/> </repeat> </code></pre> <p>しかし、それはのように、私の望ましい結果は次のようになり、何かに動作していない:私はint型の値を超えるリピートしようとしています脂肪無料PHPを使用して
参考にしてキャプチャしてから、ラムダボディの前方を使用するのはどうですか?価値観を捉えることはあなたのためには行いません。 – Arunmu
また、あなたがしたいことに擬似コードを書くことができれば助けになります。 – Arunmu
ラムダをどのように使用する予定ですか?また、あまりにも悪い '[a =(std :: forward (a)...)](){};'はコンパイルされません。他の場所で引数を使用しない場合、コンパイラはキャプチャを最適化できます。 – coyotte508