関数ポインターを使用して組み込み関数を参照するにはテンプレート クラスの「大なり」演算子 (「>」) のような演算子では、正しい型のオーバーロードを指定する必要があります。ただし、これは難しい場合があります。
算術演算子や論理演算子などの C 組み込み演算子は、実際の演算子関数ではありません。代わりに、コンパイラによってアセンブリ命令に直接変換されます。したがって、それらの関数ポインタを取得することはできません。
C 標準で定義されている関数オブジェクトは、関数ポインタのように動作する操作を操作する方法を提供します。実際の関数ではありません。これらは、operator() 関数内の類似の演算子に減衰するテンプレート オブジェクトです。
たとえば、std::greater 関数オブジェクトは、大なり演算子 (">") を表します。これは、テンプレート クラスの関数ポインター引数として使用できます。
<code class="cpp">template<typename ParamsType, typename FnCompareType> class MyAction { public: MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare) : arg0_(arg0), arg1_(arg1), fnCompare_(fnCompare_) {} bool operator()() { if((fnCompare_)(arg0_,arg1_)) { // Do this } else { // Do s.th. else } } private: ParamsType& arg0_; ParamsType& arg1_; FnCompareType& fnCompare_; }</code>
<code class="cpp">void doConditional(int param1, int param2) { MyAction<int, std::greater<int>> action(param1, param2); if(action()) { // Do this } else { // Do that } }</code>
関数ポインターは、組み込み演算子で直接使用することはできませんが、実際の関数として実装された標準ライブラリ演算子とともに使用できます。ただし、オペレーターのテンプレート クラスの特定のインスタンスをインスタンス化する必要があり、コンパイラーはテンプレート引数を正しく推定するためのヒントを必要とする場合があります。
以上が## C 組み込み演算子への関数ポインタを取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。