C++ 从 class 外部设置指向结构中函数成员的指针
C++ setting pointer to function member in a struct from outside the class
我尝试通过 SetPtr()
.
方法从 class 外部设置 class 中 str 结构中包含的函数指针
我收到错误:非静态成员函数的使用无效。
class C {
public:
float v1, v2;
struct S {
float (*Read)();
void (*Write)(float);
} str;
float ReadV1() {
return v1;
}
void WriteV1(float value) {
v1 = value;
}
float ReadV2() {
return v2;
}
void WriteV2(float value) {
v2 = value;
}
void SetPtr(float (*read)(), void (*write)(float)) {
str.Read = read;
str.Write = write;
}
void F()
{
float f = str.Read();
str.Write(f);
}
};
int main()
{
C c;
c.SetPtr(c.ReadV1, c.WriteV2); // ERROR
c.v1 = 0;
c.F();
return 0;
}
我也试过用指向成员函数的指针替换函数指针:
class C {
public:
float v1, v2;
struct S {
float (C::*Read)();
void (C::*Write)(float);
} str;
float ReadV1() {
return v1;
}
void WriteV1(float value) {
v1 = value;
}
float ReadV2() {
return v2;
}
void WriteV2(float value) {
v2 = value;
}
void SetPtr(float (C::*read)(), void (C::*write)(float)) {
str.Read = read;
str.Write = write;
}
void F()
{
float f = str.Read(); // ERROR
str.Write(f); // ERROR
}
};
int main()
{
C c;
c.SetPtr(&C::ReadV1, &C::WriteV2);
c.v1 = 0;
c.F();
return 0;
}
但这会将错误移至 class:
error: must use ‘.’ or ‘->’ to call pointer-to-member function in
‘((C*)this)->C::str.C::S::Read (...)’, e.g. ‘(... ->*
((C*)this)->C::str.C::S::Read) (...)’
无论我尝试 this->, braces, *, ->, .
的任何组合,它都不起作用。
有什么想法吗?
谢谢!
您需要使用第二种形式(带有指向class方法的指针),但是在调用方法时您需要使用:
float f = (this->*str.Read)();
(this->*str.Write) (f);
第一种方法无法正常工作,因为指向 class 方法的指针不会衰减到指向标准函数的指针(即 float (C::*) ()
不能衰减到 float (*) ()
)。
使用 C++11
您可以将方法存储为 std::function
并使用 std::bind
:
#include <functional>
class C {
struct S {
std::function <float()> Read ;
std::function <void(float)> Write ;
} str ;
void SetPtr(float (C::*read)(), void (C::*write)(float)) {
str.Read = std::bind(read, this);
str.Write = std::bind(write, this, std::placeholders::_1);
}
void F() {
float f = str.Read();
str.Write (f);
}
}
int main () {
C c;
c.SetPtr(&C::ReadV1, &C::WriteV2);
}
我尝试通过 SetPtr()
.
我收到错误:非静态成员函数的使用无效。
class C {
public:
float v1, v2;
struct S {
float (*Read)();
void (*Write)(float);
} str;
float ReadV1() {
return v1;
}
void WriteV1(float value) {
v1 = value;
}
float ReadV2() {
return v2;
}
void WriteV2(float value) {
v2 = value;
}
void SetPtr(float (*read)(), void (*write)(float)) {
str.Read = read;
str.Write = write;
}
void F()
{
float f = str.Read();
str.Write(f);
}
};
int main()
{
C c;
c.SetPtr(c.ReadV1, c.WriteV2); // ERROR
c.v1 = 0;
c.F();
return 0;
}
我也试过用指向成员函数的指针替换函数指针:
class C {
public:
float v1, v2;
struct S {
float (C::*Read)();
void (C::*Write)(float);
} str;
float ReadV1() {
return v1;
}
void WriteV1(float value) {
v1 = value;
}
float ReadV2() {
return v2;
}
void WriteV2(float value) {
v2 = value;
}
void SetPtr(float (C::*read)(), void (C::*write)(float)) {
str.Read = read;
str.Write = write;
}
void F()
{
float f = str.Read(); // ERROR
str.Write(f); // ERROR
}
};
int main()
{
C c;
c.SetPtr(&C::ReadV1, &C::WriteV2);
c.v1 = 0;
c.F();
return 0;
}
但这会将错误移至 class:
error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘((C*)this)->C::str.C::S::Read (...)’, e.g. ‘(... ->* ((C*)this)->C::str.C::S::Read) (...)’
无论我尝试 this->, braces, *, ->, .
的任何组合,它都不起作用。
有什么想法吗? 谢谢!
您需要使用第二种形式(带有指向class方法的指针),但是在调用方法时您需要使用:
float f = (this->*str.Read)();
(this->*str.Write) (f);
第一种方法无法正常工作,因为指向 class 方法的指针不会衰减到指向标准函数的指针(即 float (C::*) ()
不能衰减到 float (*) ()
)。
使用 C++11
您可以将方法存储为 std::function
并使用 std::bind
:
#include <functional>
class C {
struct S {
std::function <float()> Read ;
std::function <void(float)> Write ;
} str ;
void SetPtr(float (C::*read)(), void (C::*write)(float)) {
str.Read = std::bind(read, this);
str.Write = std::bind(write, this, std::placeholders::_1);
}
void F() {
float f = str.Read();
str.Write (f);
}
}
int main () {
C c;
c.SetPtr(&C::ReadV1, &C::WriteV2);
}