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::*);

它将显示 Sig 作为函数签名,最后添加了 const。如果在代码中执行此操作,它会抱怨您不能在函数类型上使用限定符。似乎它应该以某种方式成为可能,因为扣除有效。

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 getter 的某个类:

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

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

另一种更直接的方法(避免usingtypedefs)是这样的:

#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 回答