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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 11:52:30215ブラウズ

## Can You Get Function Pointers to C   Built-in Operators?

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

課題

関数ポインターを使用して組み込み関数を参照するにはテンプレート クラスの「大なり」演算子 (「>」) のような演算子では、正しい型のオーバーロードを指定する必要があります。ただし、これは難しい場合があります。

組み込み演算子を関数ポインターにできない理由

算術演算子や論理演算子などの 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 サイトの他の関連記事を参照してください。

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