如何使用成员函数指针(和泛型)准确调用函数?

How to exactly invoke a function by using a member function pointer(and generics)?

我在使用声明为 class 中的结构成员的函数指针调用函数时遇到问题 在 master.cpp:

#include "headers/master.hh"
#include "headers/bus.hh"
#include <memory.h>
#include <stdint.h>
#include <iostream>

int main()
{
    int size = 4;
    Bus prova;
    int su = (prova.BIOS_ROM.*read_ptr)(prova.BIOS_ROM, size);
    printf("%p\n", (void *)prova.BIOS_ROM.read_ptr);
}

在 bus.hh 文件中:

#ifndef BUS_H
#define BUS_H

#include <stdint.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <array>

class Bus
{
public:
    template <typename T> // T is the bit width of the bus
    struct bus_t
    {
        T bitfield;
        char r_perm : 3; // 8/16/32 bit read
        char w_perm : 3; // 8/16/32 bit read

        T (Bus::*read_ptr)(struct bus_t<T> bus, int size);
        void (Bus::*write_ptr)(struct bus_t<T> bus, int size, T data);
    };

    template <typename T>
    T read(struct bus_t<T> bus, int size);

    template <typename T>
    void write(struct bus_t<T> bus, int size, T data);


    struct bus_t<uint32_t> BIOS_ROM;

public:
    Bus();
    ~Bus();
};

#include "bus.tpp"
#endif /* !BUS_H */

bus.tpp 文件:

#pragma once
template <typename T>
T Bus::read(struct bus_t<T> bus, int size)
{
    printf("Bus.bitfield is %d\n", bus.bitfield);
    printf("Size is %d\n", size);
    return bus.bitfield >> size; // 10 0001 = 33
}

template uint32_t Bus::read(struct bus_t<uint32_t> bus, int size);

template <typename T>
void Bus::write(struct bus_t<T> bus, int size, T data)
{
    //read<uint32_t>(bus, size);
    bus.bitfield = data;
}

并且在 bus.cpp 文件中:

#include "headers/bus.hh"

Bus::Bus()
{
    BIOS_ROM.bitfield = 0;
    BIOS_ROM.r_perm = 7;
    BIOS_ROM.read_ptr = &Bus::read<uint32_t>;
    BIOS_ROM.write_ptr = &Bus::write<uint32_t>;

}

Bus::~Bus()
{
}

实在找不到问题出在哪里。我是 C++ 的新手(我主要在 java/c 中编程)所以我不完全知道泛型语法在 C++ 中是如何工作的

我也试过看看这个帖子 Why can templates only be implemented in the header file? 但我实际上并没有理解我应该在我的代码中修复什么才能使它成为 运行

编辑: 使用 g++ 编译时,出现以下错误:

master.cpp:11:31: error: ‘read_ptr’ was not declared in this scope
   11 |     int su = (prova.BIOS_ROM.*read_ptr)(prova.BIOS_ROM, size);

我不知道为什么它作为 C++ template-header 问题的副本被反复关闭。您似乎误解了 pointer-to-member 语法。我想你要找的是:

int su = (prova.*prova.BIOS_ROM.read_ptr)(prova.BIOS_ROM, size);

具体对象或引用 fire 成员的一般语法是

(obj.*memfnptr)(arguments...)

如果使用 pointer-to-object 调用 pointer-to-member,则语法变为:

(ptr->*memfnptr)(arguments...)

您可以在此处阅读更多相关信息:Member access operators