c ++ shared_ptr与std :: function或double(* SOME_NAME)(double);

时间:2013-03-27 04:52:54

标签: c++ function shared-ptr

Q1)鉴于我们已经

typedef double (*function_t)(double);

typedef std::function<double(double)> function_t;

我们如何定义

std::shared_ptr<function_t> ptr_func = ???

用于某些功能。

假设我们想要一个已经定义的对象shared_ptr(忘记它现在已经失败了 - 但我需要这个)。作为示例,请考虑以下类型为double的对象。

struct null_deleter
{
    void operator() (void const *) const {};
};

int main()
{
    // define object
    double b=0;

    // define shared pointer
    std::shared_ptr<double> ptr_store;
    ptr_store.reset(&b,null_deleter()); // this works and behaves how you would expect
}

虽然我们对shared_ptr类型function_t执行相同操作,即

double f (double x)
{
    // some_function + return
}

int main()
{

    // define shared pointer
    std::shared_ptr<function_t> ptr_store;
    ptr_store.reset(&f,null_deleter()); // ERROR: does not work
}

返回的错误如下所示:

error: cannot convert 'double (*)(double)' to 'double (**)(double)' in initialization

std::function

的情况
error: cannot convert 'double (*)(double)' to 'std::function<double(double)>*' in initialization

很明显没有传递正确的类型,可能我们不允许这样做(?)

注意:在Windows MinGW

上使用g++4-7-2版本编译-std=c++11 -O3

这几个答案效果很好,今天我会回复你。早上6点30分,我还没睡觉。我正在实现的整个设计模式可能是错误的,希望我稍后可以解释一下:|

2 个答案:

答案 0 :(得分:0)

这是做作的,但是如果不理解你究竟想要做的事情,我能想出的最好:

#include <iostream>

typedef std::function<double(double)> function_t;

double f(double t)
{
    return t*5;
}

int main(int argc, char*argv[])
{
    // You usually want to attach the shared pointer to a dynamically allocated object
    std::shared_ptr<function_t> ptr;
    ptr.reset(new function_t(std::bind(&f, std::placeholders::_1)));
    std::cout << (*ptr)(5.0);

    // But we can attach the smart pointer to a local function object on the stack (BAD IDEA)
    function_t fff = std::bind(&f, std::placeholders::_1);
    ptr.reset(&fff);
    std::cout << (*ptr)(5.0);
}

答案 1 :(得分:0)

我尝试清除原始函数指针,并且更喜欢将它们包装在函数对象中。遵循该方法,下面的代码工作。 shared_ptr想要包含指向作为其第一个模板参数的类型的对象的指针,因此如果您使用

std::shared_ptr<function_t>

然后它必须包含

function_t*

你有那个部分。

通常,可以传入指向动态分配对象的指针,如

std::shared_ptr<function_t> ptr_store( new function_t( f ) );

但是在你的情况下你想传递一个已经在堆栈上的对象的地址。

所以我创建了一个名为function_t的本地foo对象,然后将其地址 - 以及null_deleter - 传递给shared_ptr,一切正常。

我希望这有帮助!

P.S。我使用的是Microsoft Visual Studio 2010

#include <functional>
#include <memory>
#include <iostream>

typedef std::function<double(double)> function_t;

struct null_deleter
{
  void operator() (void const *) const {};
};

double f (double x)
{
  return 2.0 * x;
}

int main( int argc, char* argv[] )
{
  // A function object on the stack
  function_t foo( f );

  // Putting this in a local scope to verify that when the shared_ptr goes
  // out of scope, nothing bad happens.
  double result1;
  {
  std::shared_ptr<function_t> ptr_store;
  ptr_store.reset( &foo, null_deleter() );

  result1 = (*ptr_store)( 10.0 );
  std::cout << result1 << std::endl;
  }
  // ptr_store has now been destroyed

  // Calling the foo function object again just to be sure it's still OK
  double result2 = foo( 5.0 );
  std::cout << result2 << std::endl;
}