繁体   English   中英

从boost :: any恢复函数指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM