我正在编写一个离散事件模拟器(DES),其中事件将是用户编程的函数。 我有一个名为UserEvents的类和一个名为Add
的私有成员函数 void Add(const void *Parameters, void *ReturnValue);
我正在尝试制作一个存储以下结构的向量:
typedef struct FunctionPointerAlias { std::string FAlias; void(UserEvents::*FPointer)(const void*, void*); };
基于字符串,我想调用不同的函数。因此切换会很好但是切换不能处理字符串(我不想哈希我的字符串)。 所以我用一个struct(字符串Alias,FunctionPointer)创建了一个向量,然后我将迭代我的向量,查找用户输入的字符串,恢复相应的函数指针并调用它。
所有用户函数都应为void类型,接收参数并通过void *指针返回值:
void UserEvents::Add(const void *Parameters, void *ReturnValue)
{
int *A = (int*)Parameters;
int *B = A;
B++;
int *C = (int*)ReturnValue;
*C = *A + *B;
//memcpy(ReturnValue, &C, sizeof(int));
return;
}
(TL; DR)问题在于我尝试调用函数指针指向的函数。我得到错误“表达式括号前面的表达式必须具有(指向 - ) - 函数类型”在右侧上方的行中返回“添加”if。
void UserEvents::Choose(const std::string Alias, const void *Parameters, void *ReturnValue)
{
if (Alias == "Example")
{
// *ReturnValue = Function(Parameters)
return;
}
if (Alias == "Add") {
void (UserEvents::*FunctionPointer)(const void*, void*) = &UserEvents::Add;
(*FunctionPointer)(Parameters, ReturnValue);
return;
}
}
答案 0 :(得分:1)
我认为通过指针调用该成员函数的语法应该是例如。
( this->*FunctionPointer )( Parameters, ReturnValue );
C ++有两个运算符.*
和->*
,专门用于通过指针访问类成员。这是article on the topic。无处不在的*
运算符不适用于类成员指针。
答案 1 :(得分:0)
我不太了解你需要什么,所以我尝试做一些一般的事情,你应该在你自己的班级中使用这个模式:
#include <iostream>
#include <string>
typedef void(*STR_FUNC)(const void*, void*);
struct FUNCTION_POINTER_ALIAS
{
std::string FAlias;
STR_FUNC fn;
};
void FN0(const void *Parameters, void *ReturnValue)
{
std::cout << *(std::string*) Parameters << " FN0" << std::endl;
}
void FN1(const void *Parameters, void *ReturnValue)
{
std::cout << *(std::string*) Parameters << " FN1" << std::endl;
}
void FN2(const void *Parameters, void *ReturnValue)
{
std::cout << *(std::string*) Parameters << " FN2" << std::endl;
}
int main()
{
FUNCTION_POINTER_ALIAS Items[] = {{"str0", FN0}, {"str1", FN1}, {"str2", FN2}};
for (int i = 0; i < sizeof(Items) / sizeof(FUNCTION_POINTER_ALIAS); ++i)
Items[i].fn(&Items[i].FAlias, NULL);
}