11

クラスの演算子を指すポインタをC ++(またはc ++ 0x)で書きたいと思います.AまたはBと言います.それを行う方法はありますか?

もちろん、次のような構文があります

int (A::*_p) ();

しかし、それはこの問題を解決しません。基本クラスを指定せずに、一般的なポインターを作成したい-「演算子関数」のポインターのみ

#include <thread>
#include <iostream>

using namespace std;

class A
{
public:
    int operator()()
    {
        return 10;
    }
};

class B
{
public:
    int operator()()
    {
        return 11;
    }
};

int main()
{
 A a;
 int (*_p) ();
 _p = a.operator();
 cout << _p();

 B b;
 _p = b.operator();
 cout << _p();
}
4

1 に答える 1

22

いいえ、できません。クラス型は、演算子メンバー関数の型の一部です。

のタイプは のタイプとA::operator()()は異なりB::operator()()ます。前者は typeint (A::*)()で、後者は typeint (B::*)()です。これらのタイプはまったく無関係です。

最も近い方法は、C++0x ポリモーフィック関数ラッパーfunction(C++0x、C++ TR1、および Boost に含まれる) のようなものを使用bindし、メンバー関数ポインターをクラス インスタンスにバインドするために使用することです。

std::function<int()> _p;

A a;
_p = std::bind(&A::operator(), a);
std::cout << _p();

B b;
_p = std::bind(&B::operator(), b);
std::cout << _p();
于 2010-11-14T09:29:16.017 に答える