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分,我还没睡觉。我正在实现的整个设计模式可能是错误的,希望我稍后可以解释一下:|
答案 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;
}