智能指针功能

时间:2018-01-18 14:40:49

标签: c++ pointers

我正在尝试创建指向我的函数的智能指针。

我有这个功能:

double returnValue(int i){
       return i;
}

创建原始指针非常简单:

double (*somePTR)(int) = &returnValue;

但是如何制作指向该功能的智能指针,例如shared_ptr

auto someptr = std::make_shared<double>(&returnValue);

我尝试了很多选项,但没有任何效果。

5 个答案:

答案 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
  // ...
}