1

我想使用 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);
4

1 回答 1

1

我想做的事甚至被允许吗?

绝对地。只要你将它转换回你给它的类型

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

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

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

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

The best you can do is have a list of specific function parameter sets that you accept, stored in a boost::variant object. You can use a visitor to figure out which particular function to call.

于 2011-10-24T19:10:15.267 回答