我想使用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);
}
---- ---- EDIT
好吧,你是对的,之所以这样做是因为foo是一个类成员函数。
含义:
void MyClass::foo();
myInfo.functionPointer = &MyClass::foo;
所以我需要输入type:
typedef void(MyClass::*voidClassFunction)(void);
voidClassFunction myVoidFunction = boost::any_cast<voidClassFunction>(functionList[0].functionPointer);
答案 0 :(得分:1)
我甚至想要做什么?
绝对。只要你把它转回完全你给它的类型。
这就是你的问题。你没有。 foo2
不是voidFunction
。因此,您无法将其转换为一个。
boost::any
的目的是让void*
保证根据C ++标准正常工作或抛出异常。 C ++标准允许将任何(非成员)指针类型转换为void*
。它还允许将void*
转换回类型,前提是所提供的类型与原始类型完全相同类型。如果不是,欢迎来到未定义的行为。
boost::any
以通过使用void*
存储类型信息来防止未定义的行为。当您尝试将某些内容转换为错误类型时,它会正确地抛出异常。就像你在这里一样。 boost::any
不是一种假装类型不存在的方式,并假装你可以把任何东西变成别的东西。它只是一种类型安全的无类型容器。你仍然需要知道你实际放在那里的东西。
无法使用任意参数列表存储函数列表,并使用相同的参数列表调用它们。用户必须提供具有您期望的正确参数列表的函数或函子。 boost::bind
是一种为特定参数列表调整函数/函子的方法,但用户必须明确使用它。
您可以做的最好的事情是拥有一个您接受的特定函数参数集列表,存储在boost::variant
对象中。您可以使用访问者确定要调用的特定函数。