【发布时间】:2014-12-30 01:19:55
【问题描述】:
我有一个类foo 有一个方法bar,它采用一些可调用的东西(函数指针/函子)。这个可调用的东西应该被传递给另一个方法doit作为绑定元素与第三个方法bar_cb方法。
#include <functional>
#include <iostream>
class foo {
public:
template<typename T>
void bar(T&& t) {
std::cout << "bar\n";
doit(std::bind(&foo::template bar_cb<T>, this, std::forward<T>(t)));
}
template<typename T>
void doit(T&& t) {
std::cout << "doit\n";
t();
}
template<typename T>
void bar_cb(T&& t) {
std::cout << "bar_cb\n";
t();
}
};
void lala() {
std::cout << "lala\n";
}
class functor {
public:
void operator()() {
std::cout << "functor::operator()\n";
}
};
int main() {
foo f;
functor fn;
f.bar(fn);
f.bar(std::bind(lala)); // error
return 0;
}
这适用于functors,但不适用于作为foo::bar 参数的绑定函数(在我的示例中为lala)。是否可以将一个不可知的类型传递给一个方法并在这个方法中将它作为参数绑定到另一个(如果可以的话)?
我知道我可以在函数周围包装一个仿函数(例如std::function),但由于我可以调用一个不可知的类型,我认为还有一种方法可以绑定它(我想我只是缺少一些简单的东西)。
Here 示例链接。
【问题讨论】:
-
您要解决的实际(更高级别)问题是什么?
-
@JohnZwinck 问题是我想要一个类,它接受一个仿函数或一个函数,并用这个
callable作为参数调用其他仿函数。真正的代码是一个可变参数模板类,具有不同的仿函数作为模板参数。但是,我试图将问题总结为一个简单的非模板类,以了解问题所在。我也想避免std::function的开销。 -
您遇到了
bind对绑定表达式的特殊处理。 stackoverflow.com/questions/10777421/stdbind-a-bound-function -
使用 lambda 代替
std::bind,也许吧? Live example。不过,不确定对完美转发的影响。 -
写一个
unbind接受一个绑定表达式并将它包装在一个不是绑定表达式的类型中?但在其他方面表现相同?
标签: c++ c++11 bind function-pointers boost-bind