我有以下 tr1::function 原型(prototype),我正试图将其转换为 void*:
typedef std::tr1::function<cv::Mat (const cv::Mat,const void*)> preprocessingFunc;
在这个函数中,我将它存储在一个 vector 中,该 vector 包含表示函数类型和函数指针的结构:
void ImageGraph::addNode(preprocessingFunc func)
{
NodeFunction nodeFunction = { typeid(func), (void*)func };
//nodes.push_back(nodeFunction);
}
我得到的错误:
ImagePipeline.cpp: In member function ‘void IP::ImageGraph::addNode(IP::preprocessingFunc)’: ImagePipeline.cpp:32: error: invalid cast from type ‘IP::preprocessingFunc’ to type ‘void*’ /usr/include/c++/4.2.1/typeinfo:135: error: ‘std::type_info::type_info(const std::type_info&)’ is private ImagePipeline.cpp:32: error: within this context
是否可以将此函数类型转换为指针 (void*)?如果没有,是否有更好的方法来实现我正在做的事情?
为清楚起见,我存储函数指针以供日后调用,它们目前是 3 种类型的函数指针,但我想将它们全部存储在同一个 vector 中。
最佳答案
指向成员函数的指针不能存储在函数指针中,因为从本质上讲,成员函数有一个隐藏参数(“this”指针)。
有两种解决方案:要么是一个真正的“指向成员函数的指针”(这需要正确类型的函数指针),要么使函数成为静态的,并将对象本身作为指针(例如 void)传入。
对我来说,这似乎是一种奇怪的解决方案,我认为可能有更好的解决方案,例如使用接口(interface)类,并将接口(interface)对象添加为“节点”?
有关“指向成员函数的指针”的更多信息,请看这里: http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html
但是鉴于下面的评论,您实际上是在尝试将对象存储在指针中。这类似于 (void *)3.1415926;
- 它没有意义。您可能不应该在这里使用 void *,而应该使用其他东西,例如指向 function<> 的指针 [并更改您的 addNode 以获取指向 preprocessingFunc 对象的指针]。
关于c++ - 将 tr1::function 转换为 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14001709/