指向 const 成员函数 typedef 的指针

发布于 09-06 00:04 字数 456 浏览 10 评论 0原文

我知道可以像这样分开创建一个指向成员函数的指针

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 with 作为函数签名,并在末尾添加 const。如果在代码中执行此操作,它会抱怨您不能在函数类型上使用限定符。看来这应该是可能的,因为推论有效。

I know it's possible to separate to create a pointer to member function like this

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

Is there similar way to construct a pointer to a const function? I've tried adding const in various places with no success. I've played around with gcc some and if you do template deduction on something like

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

It will show Sig with as a function signature with const just tacked on the end. If to do this in code it will complain that you can't have qualifiers on a function type. Seems like it should be possible somehow because the deduction works.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白龙吟2024-09-13 00:04:57

您想要这样:

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

如果您想仍然将 MemFuncType 基于 FuncType,则需要更改 FuncType

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

You want this:

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

If you want to still base MemFuncType on FuncType, you need to change FuncType:

typedef void FuncType() const;
typedef FuncType K::* MemFuncType;
坏尐絯2024-09-13 00:04:57

稍微改进一下,展示了如何在没有 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);

A slight refinement showing how to do it without a typedef.
In a deduced context like the following, you can't use a typedef.

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

applied to some class with a const getter:

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

Foo obj;
int sz = extract_field(obj, &Foo::get_int);
万水千山粽是情ミ2024-09-13 00:04:57

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

#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 是一个指向 Object< 的 const 方法指针。 /代码>。

Another more direct way to do it (avoiding using and typedefs) is this:

#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 is a const method pointer to Object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文