2

我有以下 tr1::function 原型,我试图将其转换为 void*:

typedef std::tr1::function<cv::Mat (const cv::Mat,const void*)> preprocessingFunc;

在这个函数中,我将它存储在一个向量中,该向量包含表示函数类型和函数指针的结构:

void ImageGraph::addNode(preprocessingFunc func)
{
    NodeFunction nodeFunction = { typeid(func), (void*)func };
    //nodes.push_back(nodeFunction);
}

我得到的错误:

ImagePipeline.cpp:在成员函数“void IP::ImageGraph::addNode(IP::preprocessingFunc)”中:ImagePipeline.cpp:32:错误:从类型“IP::preprocessingFunc”到类型“void*”/usr 的无效转换/include/c++/4.2.1/typeinfo:135: 错误:'std::type_info::type_info(const std::type_info&)' 是私有的 ImagePipeline.cpp:32: 错误:在此上下文中

是否可以将此函数类型转换为指针(void *)?如果没有,有没有更好的方法来实现我正在做的事情?

为了清楚起见,我存储了函数指针以供以后调用,它们目前是 3 种类型的函数指针,但是我想将它们全部存储在同一个向量中。

4

2 回答 2

1

指向成员函数的指针不能存储在函数指针中,因为本质上,成员函数有一个隐藏参数(“this”指针)。

有两种解决方案:要么是真正的“指向成员函数的指针”(这需要正确类型的函数指针),要么将函数设为静态,并将对象本身作为指针传入(例如 void)。

对我来说,这似乎是一种奇怪的解决方案,我认为有更好的解决方案,例如使用接口类,并将您的接口对象添加为“节点”,也许?

有关“指向成员函数的指针”的更多信息,请查看此处: http: //www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html

但是鉴于下面的评论,您实际上是在尝试将对象存储在指针中。这类似于(void *)3.1415926;- 它没有意义。您可能不应该在此处使用 void * ,而是使用其他东西,例如指向 function<> [并更改您的 addNode 以获取指向 preprocessingFunc 对象的指针]。

于 2012-12-22T11:42:22.500 回答
0

你似乎从错误的一端接近它。你为什么用void*?您声明您有“当前 3 种类型的函数指针”。要存储可调用的东西,请使用tr1::function<>. 它可以从最合理的来源初始化:函数指针、指向成员函数的绑定指针、函子,显然还有tr1::function其他

于 2012-12-22T13:16:46.480 回答