C++ では、非型のテンプレート パラメーターをポインター (関数ポインター、型など) にすることができます。最近、これが何に役立つかについて質問しました。これは、回答の 1 つに対するフォローアップです。
問題の関数ポインタである関数引数から、関数ポインタ テンプレート パラメータの値を推測することは可能ですか? 例えば:
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
この控除を実現する方法はありますか?関数引数がコンパイル時にコード内の関数に解決できる限り、コンパイラの実装者の観点からは技術的に可能と思われます。
この背後にある動機について疑問がある場合は、この回答の下のコメント、特に実装の最適化の可能性を参照してくださいstd::bind()
。
編集: のように、関数の引数を削除してテンプレートの引数を使用するだけでよいことがわかりましたtempl<func>()
。関数引数を追加した唯一の目的は、テンプレート引数を渡す必要がないようにすることでした。
私が本当に欲しいのは、次のように関数ポインターの型も推測することだと思います。
template <typename Function, Function F>
void templ(/* something */);
そして、呼び出すことができます
templ(func);
また
templ<func>();
関数ポインターの単一の言及から型と値の両方を推定します。
それが今より理にかなっていることを願っています。