gpt4 book ai didi

c++ - 如何使用智能指针对象执行成员函数指针?

转载 作者:行者123 更新时间:2023-12-01 21:57:12 30 4
gpt4 key购买 nike

我正在尝试使用智能指针实例执行类的成员函数。该函数的地址是按值传递的,我想通过相应类的智能指针实例来调用该函数。

我已经尝试过这个:

(registerList.*setRegister)();

但它出错了:

no match for ‘operator->*

注册类成员函数:

uint16_t Registers::getSP()
{
return this->sp;
}

代码片段:

std::unique_ptr<Registers> registerList;

SetRegisteropcodeLdWordRegister(&Registers::getSP)

void opcodeLdWordRegister(uint16_t (*Registers::setRegister)())
{
(registerList.*setRegister)();
}

最佳答案

首先,您显示的代码和错误消息不匹配。对于给定的代码you should be getting (from clang) following error message

error: left hand operand to .* must be a class compatible with the right hand operand, but is 'std::unique_ptr<Registers>'    
(registerList.*setRegister)();
^

这可以通过取消引用指针来解决(就像 @Caleth 的答案):

((*registerList).*setRegister)();
<小时/>

现在,当您尝试以下语法时,问题中显示的错误消息:no match for ‘operator->* 应该出现。( Minimal reproducible code )

(registerList->*setRegister)();

这是因为智能指针没有pointer-to-member access operator标准中定义。因此,您需要通过 operator* 或通过成员函数 std::unique_ptr::get 取消引用智能指针。 ,并调用成员函数。

使用成员std::unique_ptr::get正确的语法是( See the live demo online )

(registerList.get()->*setRegister)()
<小时/>

话虽如此,如果您有权访问 使用统一版本的函数调用器std::invoke使用相应的实例调用成员函数,这样您就可以忘记 operator->* 的(可能)复杂语法。

您的代码也有几个问题:

  • opcodeLdWordRegister 中的成员函数指针类型是错了,应该是

    return_type(Class_name::* variable_name)(/*parameters_types, if any*/)

    以下是修复后的版本。

    #include <functional>  // std::invoke

    void opcodeLdWordRegister(uint16_t(Registers:: * setRegister)())
    // ^^^^^^^^^^^^^^^^^^^^^^^^^ >>> correct syntax
    {
    std::invoke(setRegister, registerList);
    // ^^^^^^^^^^^ member function
    // ^^^^^^^^^^^^ instance
    }
  • 其次,取消引用未初始化的 registerList 指针会引起UB。

以下是该案例的最小完整示例:( See the live demo online )

#include <iostream>
#include <functional> // std::invoke
#include <memory> // std::unique_ptr

class Registers
{
uint16_t sp{2}; // member initialized with 2
public:
uint16_t getSP() const // function can be marked const as it does not alter the member
{
return this->sp;
}
};

auto registerList = std::make_unique<Registers>(); // initialized the pointer with default object

void opcodeLdWordRegister(uint16_t(Registers::*setRegister)() const)
// ^^^^^^^^^^^^^^^^^^^^^^^^^ correct syntax
{
std::cout << std::invoke(setRegister, registerList);
}

int main()
{
opcodeLdWordRegister(&Registers::getSP);
return 0;
}

输出:

2

关于c++ - 如何使用智能指针对象执行成员函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58765495/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com