ホームページ >バックエンド開発 >C++ >C の組み込み標準演算子への関数ポインタを取得できますか?

C の組み込み標準演算子への関数ポインタを取得できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-25 22:10:28190ブラウズ

Can you get a function pointer to a built-in standard operator in C  ?

組み込みの標準演算子の関数ポインタを取得することは可能ですか?

組み込みの標準演算子の関数ポインタを取得できないのはなぜですか?関数ポインターを持たない

C 11 は、[over.built] で組み込み演算子を定義し、これらの演算子がオーバーロードの解決に参加するが、他の目的は果たさないことを指定します。そのため、それらを指す関数ポインターを持つことはできません。

関数オブジェクトの操作

この問題に対処するために、標準では [function.objects] に関数オブジェクトが導入されています。これらのオブジェクトは、operator() 関数の対応する演算子に減衰できます:

  • 算術演算
  • 比較 (equal_to、not_equal_to、greater/less、greater_equal/less_equal)
  • 論理演算
  • ビット単位の演算

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。