2015-04-20 44 views
0

我想实现一个成员函数,该函数将指针指向其他成员函数并返回静态绑定。可能是什么:一个lambda或? std::function采用成员函数并返回静态lambda/std :: function的C++函数

由于这一刻,我在C++ 11作了如下意图没有成功:

#include <functional> 
#include <iostream> 

class MyClass{ 
public: 
    auto link(std::function<void(MyClass::*)(int)> func)->std::function<void(int)> 
    { 
     return [this, func](int i){func(i);}; 
    } 
    auto myFunc(int i)->void { std::cout << "Ok:" << i << std::endl; } 

    auto test()->void 
    { 
     link(&MyClass::myFunc)(4); 
    } 
}; 

auto main()->int 
{ 
    MyClass c; 
    return 0; 
} 

回答

5

专业化std::function<T>如果T是一个函数类型仅定义。没有std::function<T>,其中T是成员函数类型的指针。无论如何,如果你只是想传递成员函数的指针,那么为参数构造一个std::function就没有意义了。可以这样做直接像这样:

auto link(void (MyClass::*func)(int))->std::function<void(int)> 

一个指针,成员函数必须使用.*->*操作者用适当的类或指针到左侧类类型(分别)的表达被调用。因此,在这种情况下,你可以这样写:

return [this, func](int i){(this->*func)(i);}; 
+0

*“没有标准::功能,可以从一个指针到成员函数直接构造” *时, re是'std :: function ' –

+0

@PiotrS。哎呀,我忘了C++实际上可以让你这样做。我将不得不编辑我的答案。 – Brian

1

您可以实现这一点使用std::bind有任何成员指针,或std::function,如你所愿:

auto link_pointer_to_member(void(MyClass::*func)(int))->std::function<void(int)> 
{ 
    return std::bind(func, this, std::placeholders::_1); 
} 

auto link_function(std::function<void(MyClass*, int)> func)->std::function<void(int)> 
{ 
    return std::bind(func, this, std::placeholders::_1); 
} 
1

要建立在其他的答案,你可以概括这对于任何成员函数指针这样的:

template <typename Ret, typename... Args> 
auto link(Ret(MyClass::*func)(Args...))->std::function<Ret(Args...)> 
{ 
    return [this, func](Args... args){ return (this->*func)(args...);}; 
}