C 11 は、[over.built] で組み込み演算子を定義し、これらの演算子がオーバーロードの解決に参加するが、他の目的は果たさないことを指定します。そのため、それらを指す関数ポインターを持つことはできません。
この問題に対処するために、標準では [function.objects] に関数オブジェクトが導入されています。これらのオブジェクトは、operator() 関数の対応する演算子に減衰できます:
user1034749 によって提供された応答に示されているように、関数オブジェクトは関数ポインターの引数として使用できます。
標準ライブラリ演算子の場合、関数ポインターとして使用できますが、それぞれのテンプレート インスタンスを参照する必要があります。コンパイラには、正しいテンプレートを推定するために十分なヒントが必要です。以下に例を示します。
<code class="cpp">#include <iostream> #include <string> using namespace std; template<class Test> Test test_function(Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &)) { return FPtr(a, b); } int main() { typedef basic_string<char> String; String a("test"), b("test2"); cout << test_function(a, b, &operator+); return 0; }</code>
この例では、演算子は test_function の関数ポインターとして提供されます。 test_function のテンプレート引数を省略すると、MSVC 2012 などの一部のコンパイラでは推定が失敗することに注意してください。
以上がC の組み込み標準演算子への関数ポインタを取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。