[英]Recovering a function pointer from a boost::any
我想使用boost :: any来存储异构函数指针。 当我尝试使用boost :: any_cast重铸到函数指针时,出现异常。
我想做的事甚至被允许吗?
。H:
typedef void(*voidFunction)(void);
struct functionInfo{
CString functionName;
boost::any functionPointer;
};
void foo();
int foo2(int a);
.cpp
void foo()
{
;//do something
}
int foo2(int a)
{
;//do something
}
void main()
{
vector<functionInfo> functionList;
functionInfo myInfo;
myInfo.functionName = _T("foo");
myInfo.functionPointer = &foo;
functionList.push_back(myInfo);
myInfo.functionName = _T("foo2");
myInfo.functionPointer = &foo2;
functionList.push_back(myInfo);
voidFunction myVoidFunction = boost::any_cast<voidFunction>(functionList[0].functionPointer);
}
- - 编辑 - -
好的,您是对的,之所以如此行事,是因为foo是一个类成员函数。
含义:
void MyClass::foo();
myInfo.functionPointer = &MyClass::foo;
所以我需要输入typedef:
typedef void(MyClass::*voidClassFunction)(void);
voidClassFunction myVoidFunction = boost::any_cast<voidClassFunction>(functionList[0].functionPointer);
我想做的事甚至被允许吗?
绝对。 只要你将它转换回正是你给它的类型。
那就是你的问题。 你不知道 foo2
不是voidFunction
。 因此,您不能将其转换为一个。
boost::any
的目的是要有一个void*
,它可以根据C ++标准正确工作或引发异常。 C ++标准允许将任何(非成员)指针类型转换为void*
。 如果提供的类型与原始类型完全相同 ,它还允许将void*
转换回类型。 如果不是,欢迎使用未定义的行为。
boost::any
通过使用void*
存储类型信息来防止未定义行为。 当您尝试将某些内容转换为错误的类型时,它将正确地引发异常。 就像您在这里一样。 boost::any
不能假装类型不存在,也不能假装您可以将任何东西变成其他东西。 这只是一个类型安全的无类型容器。 您仍然需要知道实际放置的内容。
无法存储带有任意参数列表的函数列表,并使用相同的参数列表调用它们。 用户必须为函数或函子提供所需的正确参数列表。 boost::bind
是一种使函数/函数适合特定参数列表的方法,但是用户必须明确使用它。
最好的办法是将您接受的特定功能参数集的列表存储在boost::variant
对象中。 您可以使用访问者找出要调用的特定函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.