具体std :: bind的返回数据类型究竟是什么?

时间:2013-10-16 17:28:39

标签: c++ boost c++11 std

首先我要说我必须知道std :: bind的返回数据类型。

我有一个定义为

的结构
typedef struct
{
  UINT ID;
  CString NAME;
  boost::any Func;// 'auto' doesn't work here
} CALLBACK;
CALLBACK CallBackItems[];

Func是一个函数持有者,我希望它拥有不同类型的回调函数。

我在某处初始化CallBackItems:

CallBackItems[] =
{       
    { 1,    L"OnReady",       std::bind(&CPopunderDlg::OnReady, pDlg)           },
    { 2,    L"CustomFunction",std::bind(&CPopunderDlg::OnFSCommond, pDlg,_1,_2) }   
   //...................    more items here         
};

当我尝试使用' Func'在每个CALLBACK中,我必须先将其强制转换然后像函数一样使用它。到目前为止我试过了:

 //CallBackItems[0].Func is binded from pDlg->OnReady(), pDlg->OnReady() works here,
   boost::any_cast<function<void()>>(CallBackItems[0].Func)();

   ((std::function<void()>)(CallBackItems[0].Func))();

它们都不起作用,任何人都知道如何从std :: bind?

转换返回的变量

1 个答案:

答案 0 :(得分:4)

std::bind返回的类型未指定:

  

20.8.9.1.3函数模板绑定[func.bind.bind]

     

1 ...

     

template<class F, class... BoundArgs>
   未指定 bind(F&& f, BoundArgs&&... bound_args);

您可以使用std::function存储它们,例如

void f( int ) {}
std::function< void(int) > f2 = std::bind(&f, _1);

在您的情况下,这意味着您可能需要在存储std::bind的结果时转换类型:

CallBackItems[] =
{     
    { 1, L"OnReady", std::function< void() >( std::bind(&CPopunderDlg::OnReady, pDlg) ) },
    { 2, L"CustomFunction", std::function< void(int,int) >( std::bind(&CPopunderDlg::OnFSCommond, pDlg,_1,_2) ) },                  
};

然后通过以下方式取回:

boost::any_cast<std::function<void()>>(CallBackItems[0].Func)();