gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:33 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com