1

Q1) 私たちが持っていることを考えると

typedef double (*function_t)(double);

また

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

どのように定義しますか

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

いくつかの機能のために。

すでに定義されているオブジェクトにa が必要だとしましょうshared_ptr(今のところ、目的に反することを忘れていますが、これが必要です)。例として、 type のオブジェクトについて以下を考えてみましょう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ただし、 a of typeに対して同じことを行うと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 分ですが、まだ寝ていません。私が実装しているものの全体の設計パターンはおそらく間違っています。うまくいけば、少し後で説明できます:|

4

2 に答える 2

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);
}
于 2013-03-27T05:13:48.483 に答える
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 に渡すと、すべてが機能しました。

これが役立つことを願っています!

PS私は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;
}
于 2013-03-27T05:40:37.293 に答える