如何使用成员函数指针(和泛型)准确调用函数?
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。
我在使用声明为 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。