我正在尝试创建指向我的函数的智能指针。
我有这个功能:
double returnValue(int i){
return i;
}
创建原始指针非常简单:
double (*somePTR)(int) = &returnValue;
但是如何制作指向该功能的智能指针,例如shared_ptr
?
auto someptr = std::make_shared<double>(&returnValue);
我尝试了很多选项,但没有任何效果。
答案 0 :(得分:9)
我认为你的意思是一个智能函数指针,为此,从C ++ 11开始,std::function
,那么这个怎么样:
#include <functional>
#include <iostream>
double a(int i){
return i;
}
double b(int i){
return i * 2;
}
double c(double d, int i){
return i - d;
}
int main() {
std::function<double(int)> func = a;
std::cout << func(42) << std::endl;//Output 42
func = b;
std::cout << func(42) << std::endl;//Output 84
//func = c; //Error since c has a different signature (need one more argument), #type safety
func = std::bind(c, 5 ,std::placeholders::_1); //func stores the needed 2nd argument
std::cout << func(42) << std::endl;//Output 37
}
答案 1 :(得分:3)
你做不到。智能指针仅适用于对象指针而非函数指针。
智能指针背后的意图是管理动态分配的内存。如果智能指针能够确定可以解除分配动态分配的内存,那就可以了。
函数指针没有这样的东西。
答案 2 :(得分:2)
存在智能指针来管理地址背后的数据。
如果是函数指针,则此数据为程序代码。如果指针超出范围,则不能删除函数。
智能指针无法保存函数地址,因为它们没有任何理由这样做。
答案 3 :(得分:0)
你根本做不到。由于您不进行内存管理,例如分配动态内存或在超出范围时销毁函数,例如,为此设置智能指针是没有意义的。首先看一下智能指针的用意,以及何时使用它们。
答案 4 :(得分:0)
不确定用例,可能只是因为处理的一致性而需要它。
shared_ptr<>
不能包含指向函数的指针,但可以包含指向函数指针的动态分配指针:
double f(int i) { return i; }
typedef double(*f_ptr)(int i);
int main (int _argc, char const **_argv) {
std::shared_ptr<f_ptr> s(new f_ptr(f));
(*s)(2); // okay
s.reset(); // releases a pointer to pointer, not function
// ...
}