"確かにstd関数に格納した後ではありませんが、C++で恐ろしい(しかし法的な)ハックをすることができました17しかし、あなたがそれを使うかもしれないからです。 - Yakk
ヤックのカルマを和らげましょう。ここであなたは間違いなく野生に放たしたくないC++ 14ソリューションのコンセプトの証明です:
auto magic = [a, b](auto &&... args) mutable -> decltype(auto) {
return makeOverload(
// Capture access boilerplate
[&](cap_<0>) -> auto& { return a; },
[&](cap_<1>) -> auto& { return b; },
// Actual function
[&](int p) {
return "[" + std::to_string(a) + ", " + b + "](" + std::to_string(p) + ")";
}
)(std::forward<decltype(args)>(args)...);
};
makeOverload
はファンクタの任意の数をとり、単一のものにそれらをブレンド。私はthis blog postからそのアイデアを借用し、実際に動作させるためにコメントセクションの助けを借りて助けてくれました。
結果ファンクタは、cap<N>
タグと実際の関数のパラメータの間のタグディスパッチに使用されます。したがって、magic(cap<0>)
を呼び出すと、対応するキャプチャされた変数、つまりa
が吐き出されます。機能の実際の動作は、もちろん、magic(123)
への通常の呼び出しでアクセス可能です。
ボーナスとして、外側のラムダはmutable
であり、キャプチャアクセサは参照によって戻されます。キャプチャされた変数には実際に読み書き可能なアクセス権があります。
あなたはこの生き物をColiru right hereの自然生息地で観察することができます。
ラムダと 'std :: function'のどちらも... – Jarod42
これはstd関数に格納した後ではありません。それがなければ、私はC++で恐ろしい(しかし合法的な)ハックでそれを行うことができます。しかし、私はあなたがそれを使用するかもしれないので、どのようにあなたに伝えるのは恐ろしい人でしょう。 – Yakk
あなたはファンクタを探しているかもしれません –