c++ - 将 tr1::function 转换为 void*

标签 c++

我有以下 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/

相关文章:

c++ - 尝试访问指针内的数组时出现段错误

c++ - 乘以 __int64

c++ - 无法检测到 C++ 同步 boost::asio::ip::tcp::socket 连接被关闭

c++ - 从字符的 ascii 代码点到 wstring

c++ - 在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc 与 clang

c++ - Windows 应用程序需要焦点

c++ - 元编程中有哪些数学运算符可用

c# - MFC 和 C# 中的信号量、临界区、互斥量示例

c++ - 调用VxGUI Constructor L6218E错误

c++ - Qt 国际化 : QT_TR_NOOP in c++ qstr() in qml