如何从成员函数创建函子?

发布于 2024-10-17 04:13:21 字数 746 浏览 1 评论 0 原文

我希望 run 调用 c.drive()

#include <functional>
using namespace std;

struct Car {
    void drive() { }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;    
    run(bind1st(mem_fun(&Car::drive), &c));    
    return 0;
}

这不会编译,并且错误消息对我没有帮助:

at f():
与调用 '(std::binder1st >) ()' 不匹配

在调用 run 时 :
“class std::mem_fun_t”中没有名为“first_argument_type”的类型
“class std::mem_fun_t”中没有名为“second_argument_type”的类型

请不要提升。

更新:即使问题解决了,我也会很高兴看到 TR1/C++0x 解决方案!

I want run to call c.drive():

#include <functional>
using namespace std;

struct Car {
    void drive() { }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;    
    run(bind1st(mem_fun(&Car::drive), &c));    
    return 0;
}

This does not compile and the error messages does not help me:

at f():
no match for call to ‘(std::binder1st<std::mem_fun_t<void, Car> >) ()’

at the call to run:
no type named ‘first_argument_type’ in ‘class std::mem_fun_t<void, Car>’
no type named ‘second_argument_type’ in ‘class std::mem_fun_t<void, Car>’

No boost please.

Update: even though the problem is solved, I would be very happy to see TR1/C++0x solutions!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

心不设防 2024-10-24 04:13:21

Boost/TR1/C++0x 解决方案非常简单:

run(std::bind(&Car::drive, &c));

The Boost/TR1/C++0x solution is quite straightforward:

run(std::bind(&Car::drive, &c));
祁梦 2024-10-24 04:13:21

bind1st 从二元函数和值中生成一元函数。您正在尝试创建一个不从一元函数中获取任何参数的函数,并且标准 C++03 中没有任何内容支持这一点。

你将不得不做这样的事情。

template<class X, void (X::*p)()>
class MyFunctor
{
    X& _x;
public:
    MyFunctor(X& x) : _x( x ) {}
    void operator()() const { (_x.*p)(); }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;
    run(MyFunctor<Car, &Car::drive>(c));
    return 0;
}

bind1st makes a unary function out of a binary function and a value. You are trying to make a function that takes no parameters out of a unary function and there isn't anything to support this in standard C++03.

You will have to do something like this.

template<class X, void (X::*p)()>
class MyFunctor
{
    X& _x;
public:
    MyFunctor(X& x) : _x( x ) {}
    void operator()() const { (_x.*p)(); }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;
    run(MyFunctor<Car, &Car::drive>(c));
    return 0;
}
婴鹅 2024-10-24 04:13:21

使用 lambda 的 C++0x 解决方案 - http://www.ideone.com/jz5B1

struct Car {
    void drive() { }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;    
    run( [&c](){ c.drive(); } );    
    return 0;
}

The C++0x solution using lambdas - http://www.ideone.com/jz5B1 :

struct Car {
    void drive() { }
};

template <typename Function>
void run(Function f) {
    f();
}

int main() {
    Car c;    
    run( [&c](){ c.drive(); } );    
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文