あなたは、operator()
を有するものである関数オブジェクトを、必要とします。この演算子はテンプレートであり、同じ(または類似の)署名をforwarding_func
として持つ必要があります。さまざまな方法で構築できます。
最も直接的な方法は、C++ 17の汎用ラムダを使用することです。
struct forwarder {
template <typename ... Args>
void operator()(Args&& ... args) { ... etc }
};
このようなフォワーダを作成する方法はまったく異なります。標準ライブラリにoverload
関数を追加する提案があります。 (それはまだ標準の一部ではないとして
auto callable = std::overload (
(void (*)(int, size_t))(target),
(void (*)(std::string, int))(target)
);
コンパイラがのstd ::オーバーロードを実装していないが、あなたは簡単にそれを自分で実装したり、ネット上の実装を見つけることができます:あなたはこのようにそれを使用します例えばthis questionを参照)。
はい、ラムダを使用することは可能です。それらを格納したい場合は、渡されたラムダオブジェクトの型にテンプレート化された 'std :: function'かクラスを使うことができます。 –
std :: functionオブジェクトにこのようなものではなく*を格納することは可能です。 –
あなたの例のラムダは(もしうまくいけば)普遍的なリファレンスではなくrvalueのリファレンス、すなわち、それは引数としてrvaluesを受け入れるだけです。私はあなたが明示的にこれを行う方法を尋ねていることを知っていますが、そこには混乱が残っているようです。ユニバーサル参照とレバル参照の違いについては、Scott Meyerの記事(https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers)をお読みください。 – Knoep