从boost :: any恢复函数指针

时间:2011-10-24 18:35:54

标签: c++ boost function-pointers 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);

}

---- ---- EDIT

好吧,你是对的,之所以这样做是因为foo是一个类成员函数。

含义:

void MyClass::foo();

myInfo.functionPointer = &MyClass::foo;

所以我需要输入type:

typedef void(MyClass::*voidClassFunction)(void);
voidClassFunction myVoidFunction = boost::any_cast<voidClassFunction>(functionList[0].functionPointer);

1 个答案:

答案 0 :(得分:1)

  

我甚至想要做什么?

绝对。只要你把它转回完全你给它的类型。

这就是你的问题。你没有。 foo2不是voidFunction。因此,您无法将其转换为一个。

boost::any的目的是让void*保证根据C ++标准正常工作或抛出异常。 C ++标准允许将任何(非成员)指针类型转换为void*。它还允许将void*转换回类型,前提是所提供的类型与原始类型完全相同类型。如果不是,欢迎来到未定义的行为。

存在

boost::any以通过使用void*存储类型信息来防止未定义的行为。当您尝试将某些内容转换为错误类型时,它会正确地抛出异常。就像你在这里一样。 boost::any 是一种假装类型不存在的方式,并假装你可以把任何东西变成别的东西。它只是一种类型安全的无类型容器。你仍然需要知道你实际放在那里的东西。

无法使用任意参数列表存储函数列表,并使用相同的参数列表调用它们。用户必须提供具有您期望的正确参数列表的函数或函子。 boost::bind是一种为特定参数列表调整函数/函子的方法,但用户必须明确使用它。

您可以做的最好的事情是拥有一个您接受的特定函数参数集列表,存储在boost::variant对象中。您可以使用访问者确定要调用的特定函数。