Sco*_*ley 1 c++ stl stdbind c++11 std-function
std :: bind的返回类型是(有意)未指定的.它可以存储在std :: function中.
下面的示例程序显示了如何将std :: bind()返回的临时对象显式转换为std :: function以调用fn1().
如果std :: bind的返回类型是可知的,我可以重载Callback构造函数并且不再需要显式地转换std :: bind临时对象.
有没有办法避免显式演员?
// g++ -std=c++11 test.cxx
#include <functional>
using std::placeholders::_1;
class A
{
public:
void funcA (int x) { }
};
class Callback
{
public:
Callback () = default;
Callback (std::function<void(int)> f) { }
// Wish we knew the return type of std::bind()
// Callback (return_type_of_std_bind f) { }
};
void fn0 (std::function<void(int)> f) { }
void fn1 (Callback cb) { }
int main (void)
{
A a;
fn0(std::bind(&A::funcA, &a, _1)); // ok
fn1(std::function<void(int)>(std::bind(&A::funcA, &a, _1))); // ok, but verbose
fn1(std::bind(&A::funcA, &a, _1)); // concise, but won't compile
}
Run Code Online (Sandbox Code Playgroud)
可能不相关,但我在Linux上使用gcc 4.7.2.
Ker*_* SB 11
最好给Callback一个通用的构造函数:
struct Callback
{
typedef std::function<void(int)> ftype;
ftype fn_;
template <typename T,
typename = typename std::enable_if<std::is_constructible<ftype, T>::value>::type>
Callback(T && f) : fn_(std::forward<T>(f))
{ }
};
Run Code Online (Sandbox Code Playgroud)
(我添加了第二个默认模板参数,只T为该语句有意义的类型启用此构造函数,以便不创建错误的可转换属性.)请注意此技术如何从转换链中删除一个隐式的用户定义转换,为.调用显式构造函数fn_.