30

このようなメンバー関数へのポインターを作成するために分離できることはわかっています

struct K { void func() {} };
typedef void FuncType();
typedef FuncType K::* MemFuncType;
MemFuncType pF = &K::func;

const 関数へのポインタを作成する同様の方法はありますか? const をさまざまな場所に追加しようとしましたが、成功しませんでした。私はいくつかのgccをいじりましたが、次のようなテンプレート推論を行う場合

template <typename Sig, typename Klass>
void deduce(Sig Klass::*);

最後に const が追加された関数シグネチャとして Sig が表示されます。コードでこれを行うと、関数型に修飾子を使用できないと不平を言うでしょう。控除が効いているので何とかなりそうです。

4

3 に答える 3

43

あなたはこれを求めている:

typedef void (K::*MemFuncType)() const;

MemFuncType引き続きベースにしたい場合はFuncType、次のように変更する必要がありますFuncType

typedef void FuncType() const;
typedef FuncType K::* MemFuncType;
于 2010-06-16T04:59:22.470 に答える
9

typedef なしでそれを行う方法を示すわずかな改良。次のような推定コンテキストでは、typedef を使用できません。

template <typename Class, typename Field>
Field extract_field(const Class& obj, Field (Class::*getter)() const)
{
   return (obj.*getter)();
}

const ゲッターを使用していくつかのクラスに適用されます。

class Foo {
 public:
  int get_int() const;
};

Foo obj;
int sz = extract_field(obj, &Foo::get_int);
于 2012-02-24T23:08:46.647 に答える
3

それを行う別のより直接的な方法 ( usingand typedefs を避ける) は次のとおりです。

#include <iostream>

class Object
{
    int i_;
public:
    int j_;
    Object()
        : Object(0,0)
    {}
    Object(int i, int j)
        : i_(i),
        j_(j)
    {}

    void printIplusJplusArgConst(int arg) const
    {
        std::cout << i_ + j_ + arg << '\n';
    }
};

int main(void)
{
    void (Object::*mpc)(int) const = &Object::printIplusJplusArgConst;

    Object o{1,2};
    (o.*mpc)(3);    // prints 6

    return 0;
}

mpcへの const メソッドポインタObjectです。

于 2019-09-22T16:00:29.430 に答える