Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从boost::any恢复函数指针_C++_Boost_Function Pointers_Boost Any - Fatal编程技术网

C++ 从boost::any恢复函数指针

C++ 从boost::any恢复函数指针,c++,boost,function-pointers,boost-any,C++,Boost,Function Pointers,Boost Any,我想使用boost::any来存储异构函数指针。当我尝试使用boost::any_cast来重铸函数指针时,会出现一个异常 我想做的事被允许了吗 .h: .cpp 所以我需要输入def: typedef void(MyClass::*voidClassFunction)(void); voidClassFunction myVoidFunction = boost::any_cast<voidClassFunction>(functionList[0].functionPointer

我想使用boost::any来存储异构函数指针。当我尝试使用boost::any_cast来重铸函数指针时,会出现一个异常

我想做的事被允许了吗

.h:

.cpp

所以我需要输入def:

typedef void(MyClass::*voidClassFunction)(void);
voidClassFunction myVoidFunction = boost::any_cast<voidClassFunction>(functionList[0].functionPointer);
typedef void(MyClass::*voidClassFunction)(void);
voidClassFunction myVoidFunction=boost::any_cast(函数列表[0]。函数指针);
我想做的事被允许了吗

当然。只要你把它投回到你给它的类型

这就是你的问题。你没有
foo2
不是一个
voidFunction
。因此,你不能把它扔给一个人

<>代码> Boo::任何< <代码>都有一个<代码> Value*/Cux>,保证按照C++标准正确工作或抛出异常。C++标准允许任何(非成员)指针类型转换为<代码> Value*/Cuff>。它还允许将
void*
转换回类型,前提是所提供的类型与原始类型完全相同。如果不是,欢迎使用未定义的行为

boost::any
通过使用
void*
存储类型信息来防止未定义的行为。当您试图将某些内容转换为错误类型时,它将正确地抛出异常。就像你在这里一样<代码>boost::any不是一种假装类型不存在并假装可以将任何东西转换成其他东西的方法。它只是一个防打字的无字体容器。你还需要知道你到底放了什么

无法存储具有任意参数列表的函数列表并使用相同的参数列表调用它们。用户必须为函数或函子提供所需的正确参数列表<代码>boost::bind是一种使函数/函子适应特定参数列表的方法,但用户必须明确使用它

您所能做的最好的事情就是将您接受的特定函数参数集列表存储在
boost::variant
对象中。您可以使用访问者来确定要调用哪个特定函数

我想做的事被允许了吗

当然。只要你把它投回到你给它的类型

这就是你的问题。你没有
foo2
不是一个
voidFunction
。因此,你不能把它扔给一个人

<>代码> Boo::任何< <代码>都有一个<代码> Value*/Cux>,保证按照C++标准正确工作或抛出异常。C++标准允许任何(非成员)指针类型转换为<代码> Value*/Cuff>。它还允许将
void*
转换回类型,前提是所提供的类型与原始类型完全相同。如果不是,欢迎使用未定义的行为

boost::any
通过使用
void*
存储类型信息来防止未定义的行为。当您试图将某些内容转换为错误类型时,它将正确地抛出异常。就像你在这里一样<代码>boost::any不是一种假装类型不存在并假装可以将任何东西转换成其他东西的方法。它只是一个防打字的无字体容器。你还需要知道你到底放了什么

无法存储具有任意参数列表的函数列表并使用相同的参数列表调用它们。用户必须为函数或函子提供所需的正确参数列表<代码>boost::bind是一种使函数/函子适应特定参数列表的方法,但用户必须明确使用它


您所能做的最好的事情就是将您接受的特定函数参数集列表存储在
boost::variant
对象中。您可以使用访问者来确定要调用哪个特定函数。

如果我将代码更改为实际编译(去掉CString/\T cruft并添加适当的include),它对我来说就可以了。当然,如果您尝试强制转换
函数列表[1]。函数指针
voidFunction
,您会得到预期的异常。如果我将代码更改为实际编译(去掉CString/\T cruft并添加适当的include),它对我来说很好。当然,如果您尝试强制转换
函数列表[1]。functionPointer
voidFunction
,您会得到预期的异常。不用担心,我不会尝试将foo2强制转换为“voidFunction”,请参阅我的编辑以了解错误的来源,但感谢剩余的信息,我会研究它。不用担心,我不会尝试将foo2强制转换为“voidFunction”“voidFunction”,请参阅我的编辑以了解错误的来源,但感谢您提供的其余信息,我将对此进行调查。
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);

}
void MyClass::foo();

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