c++ - 関数オブジェクト - メンバ関数ポインタ キャスト




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

組み込み演算子

なぜあなたはそれらの関数ポインタを持てないのか:

C ++ 11、§13.6/ 1、[over.built]

5節で定義されている組み込み演算子を表す候補演算子関数は、この節で指定されています。 これらの候補関数は、13.3.1.2 説明されているようにオペレータ過負荷解決プロセスに参加し、 他の目的には使用されません

組み込み演算子組み込み型用)は、実際の演算子関数ではありません。 だからあなたはそれらを指す関数ポインタを持つことはできません。 operator<(A,B)構文を使用してそれらを呼び出すこともできません。 それらはオーバーロード解決に参加するだけですが、コンパイラはそれらを適切なasm / machine命令に直接変換します。

この問題を回避する方法:

user1034749はすでにこの質問に回答していますが、完全を期すために:

規格は§20.8、[function.objects]で多くの関数オブジェクトを定義しています、すなわち

  • 算術演算
  • 比較
  • 論理演算
  • ビット演算

機能オブジェクトは、機能オブジェクトタイプのオブジェクトです。 関数へのポインタをアルゴリズムテンプレートに渡すことを期待するところでは(箇条25)、インタフェースは関数オブジェクトを受け入れるように指定されています。 これにより、アルゴリズムテンプレートは関数へのポインタと連携するだけでなく、任意の関数オブジェクトと連携することもできます。

C ++ 11、§20.8.5、[比較]

  • に等しい
  • not_equal_to
  • 大きい、少ない
  • greater_equal
  • less_equal

それらはそれらのoperator()関数において類似の演算子に崩壊するテンプレート化された関数オブジェクトです。 それらは関数ポインタ引数として使用できます。

user1034749は正しいです、私は言いたいです: 他の方法はありません、これらは 'raw'関数ポインタと使い方が完全に同等です。 与えられた参照

標準クラス型演算子

標準ライブラリ演算子を関数ポインタとして使うことができます(これは「実関数」として存在します)。

しかし、あなたはテンプレートのそれぞれのインスタンスを参照する必要があります。 コンパイラは正しいテンプレートを推測するための適切なヒントを必要とします。

これは私のためにMSVC 2012でstd::basic_string operator+を使って働きます

template<class Test>
Test test_function (Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &))
{
   return FPtr(a, b);
}

int main(int argc, char* argv[])
{
   typedef std::char_traits<char> traits_t;
   typedef std::allocator<char> alloc_t;
   std::basic_string<char, traits_t, alloc_t> a("test"), b("test2");
   std::cout << test_function<std::basic_string<char, traits_t, alloc_t>>(a, b, &std::operator+) << std::endl;
   return 0;
}

test_functionのテンプレート引数が演繹されるために除外されている場合、これは失敗します(少なくともMSVC 2012の場合)。

組み込み演算子の関数ポインタを参照したいのですが、特定の型オーバーロードを指定する方法がわかりません。

次のテンプレートクラスシグネチャがあります。

template<typename ParamsType, typename FnCompareType>
class MyAction
{
public:
    MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare) 
    : arg0_(arg0), arg1_(arg1), fnCompare_(fnCpmpare) {}

    bool operator()()
    {
        if((*fnCompare_)(arg0_,arg1_)
        {
            // do this
        }
        else
        {
            // do s.th. else
        }
    }

private:
    ParamsType& arg0_;
    ParamsType& arg1_;
    FnCompareType& fnCompare_;
}

そしてこのような構文を使いたいです。

void doConditional(int param1, int param2)
{
    MyAction<int,&::operator>=> action(param1,param2);
    if(action())
    {
        // Do this
    }
    else
    {
        // Do that
    }
}

しかし、それはコンパイルされません:

error: ‘::operator>=’ has not been declared

このような組み込みの静的操作を参照するにはどうすればいいですか。


C ++標準ライブラリで使用されているのと同じソリューションを使用できます。

std::sort (numbers, numbers+5, std::greater<int>());

大きいところ

template <class T> struct greater : binary_function <T,T,bool> {
    bool operator() (const T& x, const T& y) const {return x>y;}
};

あなたの場合はhttp://www.cplusplus.com/reference/functional/greater_equal/

建てられた事業者の問い合わせ先について

任意のクラスに対して既存の演算子<を参照することができます(もちろん、それらがprivate、protected、またはクラス/関数がフレンドではない場合)。 しかし、演算子<は組み込み型(bool、short、int、double)では参照できません。 イベントがC ++標準を見ていない場合は、上記の私のテキストから確認できます。





operators