C++ c++;可以指向定义了变量的函数吗

C++ c++;可以指向定义了变量的函数吗,c++,function-pointers,C++,Function Pointers,我模模糊糊地记得python允许这样的事情 def foo( x ): .... f = foo( 5 ) 是C++中可能的,所以如果我有一个成员函数< /p> class C { void foo( int x ) { ... } so that I can define a pointer or variable that would effectively point at foo( 5 ) 我之所以想这样做,是因为我有许多侦听器,我需要订阅回调并保留被调用的信息

我模模糊糊地记得python允许这样的事情

def foo( x ):
    ....

f = foo( 5 )

是C++中可能的,所以如果我有一个成员函数< /p>

class C {

    void foo( int x ) { ... }

so that I can define a pointer or variable that would effectively point at foo( 5 )
我之所以想这样做,是因为我有许多侦听器,我需要订阅回调并保留被调用的信息

class C {
     map<int, ptrSender> m_sender;

    void subscribe() {
        for (const auto& p : m_sender) {
            p .second->register( Callback( this, &C::onCall ) )
        }
我希望我能将一些东西传递到寄存器中,以返回带有预设参数的调用。这可能吗

编辑:我试图使用lambda函数,但遇到以下问题

auto setCall= [this]( int v ) { &C::onCall( v ); }
给出编译错误

lvalue required as unary&opeand
这个

还有这个

auto setCall= [this]( int v ) { C::onCall( v ); }
.... 
p.second->register( Callback( this, setCall( p.first) ) );   /// <__ error now here
autosetcall=[this](intv){C::onCall(v);}
.... 

p、 第二->寄存器(回调(这个,setCall(p.first));// 你要找的是。它接受一个可调用对象,并为您提供另一个可调用对象,其中包含其参数的预定义值,可能还有一些转发给它的可选参数


警告一句:这是一个相当陡峭的学习曲线。您需要了解模板。

您需要的是。它接受一个可调用对象,并为您提供另一个可调用对象,其中包含其参数的预定义值,可能还有一些转发给它的可选参数

警告一句:这是一个相当陡峭的学习曲线。您需要了解模板。

是的,您可以使用。用法示例:

或使用lambdas:

C c;
auto x = [&c]() { c.foo(5); };
x();
是的,你可以用。用法示例:

或使用lambdas:

C c;
auto x = [&c]() { c.foo(5); };
x();

如果要将参数值绑定到编译时常量参数(如示例中的
5
),则可以通过引入一个简单的包装函数来解决问题,该函数将调用您的函数,同时将所需的常量值作为相应的参数传递

但当参数是运行时值时,答案是否定的:通常不可能在C++中创建这样一个函数指针绑定的可信实现(除非您使用的是特定于编译器的扩展)。 但是,在C++中,你有多种可供选择的工具。您可以创建模拟所需功能的function对象。这样的函数对象可以使用

std::bind
创建,也可以使用lambda表达式创建,甚至可以手动实现

结果函数对象将是“可调用”的,其行为在表面上类似于函数指针,但它不会是函数指针,不会转换为函数指针,并且在需要真正函数指针的情况下不会被接受。换句话说,如果您的
register
方法声明期望函数指针作为其第二个参数,那么您在这里就无能为力了。无论是
std::bind
,还是lambdas,或者语言中的任何其他内容都不能帮助您实现这种参数绑定


因此,在此类设计中避开函数指针并根据通用可调用对象实现此类功能通常是一个好主意。最简单的方法是使用
std::function
对象代替原始函数指针。

如果要将参数值绑定到编译时常量参数(如示例中的
5
),然后,可以通过引入一个简单的包装函数来解决这个问题,该函数将调用您的函数,同时将所需的常量值作为相应的参数传递

但当参数是运行时值时,答案是否定的:通常不可能在C++中创建这样一个函数指针绑定的可信实现(除非您使用的是特定于编译器的扩展)。 但是,在C++中,你有多种可供选择的工具。您可以创建模拟所需功能的function对象。这样的函数对象可以使用

std::bind
创建,也可以使用lambda表达式创建,甚至可以手动实现

结果函数对象将是“可调用”的,其行为在表面上类似于函数指针,但它不会是函数指针,不会转换为函数指针,并且在需要真正函数指针的情况下不会被接受。换句话说,如果您的
register
方法声明期望函数指针作为其第二个参数,那么您在这里就无能为力了。无论是
std::bind
,还是lambdas,或者语言中的任何其他内容都不能帮助您实现这种参数绑定


因此,在此类设计中避开函数指针并根据通用可调用对象实现此类功能通常是一个好主意。最简单的方法可能是使用
std::function
对象来代替原始函数指针。

可能的重复项看起来像您想要使用绑定:该绑定看起来很有希望,让我试试看如果您喜欢lambda而不是绑定。
register
函数的参数类型是什么?特别是第二个参数。的可能重复项看起来像您想要使用绑定:该绑定看起来很有希望,如果您喜欢lambda而不是bind,那么让我试试。您的
register
函数的参数类型是什么?特别是第二个参数。我永远不会建议在lambda函数上使用std::bind。它更难理解,使用
[&](){}
您可以更轻松地控制需要复制的内容,以及可以简单引用的内容。我永远不会建议将std::bind置于lambda函数之上。它更难理解,使用
[&](){}
您可以更轻松地控制需要复制的内容和可以简单引用的内容。@smac89谢谢,我的错。如果您有std::bind可用,您将有lambdas。它们出现在同一标准版本中。在c++11中,bind有一些用例,但大多数情况下已经过时了。从c++14开始,没有bi
auto setCall= [this]( int v ) { C::onCall( v ); }
.... 
p.second->register( Callback( this, setCall( p.first) ) );   /// <__ error now here
#  define CallBack(obj,func) ProfiledBasicCallBack(obj,fastdelegate::FastDelegate0<void>(obj,func),#func)
void foo( int x ) { cout << x << endl; }
auto x = std::bind(foo, 5);
x();
void foo( int x ) { cout << x << endl; }
auto x = []() { foo(5); };
x();
C c;
auto x = std::bind(&C::foo, &c, 5);
x();
C c;
auto x = [&c]() { c.foo(5); };
x();