C ++テンプレート関数を引数として渡すことに関するルールを探しています。
これは、次の例に示すように、C ++でサポートされています。
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
ただし、この手法について学ぶことは困難です。「テンプレート引数としての関数」のグーグルはあまり役に立ちません。そして、古典的なC ++テンプレートの完全ガイドでは、驚くべきことに、それについても説明していません(少なくとも私の検索では)。
私が持っている質問は、これが有効なC ++(または単に広くサポートされている拡張機能)かどうかです。
また、この種のテンプレート呼び出し中に、同じシグネチャを持つファンクターを明示的な関数と交換可能に使用できるようにする方法はありますか?
上記のプログラムでは、少なくともVisual C ++では、構文が明らかに間違っているため、以下は機能しません。カスタム比較演算を定義したい場合に関数ポインタまたはファンクタをstd :: sortアルゴリズムに渡すことができるのと同じように、ファンクタの関数を切り替えたり、その逆を行うことができると便利です。
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
1つまたは2つのWebリンク、またはC ++テンプレートブックのページへのポインタをいただければ幸いです。
-std=gnu++17
ます。 C ++ 17キャプチャレスラムダconstexpr変換演算子の結果を、関数ポインターテンプレートの非型引数として使用できますか?。