有这么个想法,
想写一组通用的调用。
使用std::bind来绑定任意函数。
然后将这些对象放进一个容器里。
最后统一顺序调用容器中的这些函数。
现在暂时想到的写法如下。
想写一组通用的调用。
使用std::bind来绑定任意函数。
然后将这些对象放进一个容器里。
最后统一顺序调用容器中的这些函数。
现在暂时想到的写法如下。
#include <functional>
#include <vector>
typedef std::function<int()> fp;
typedef std::vector<fp> VE_FUNC;
//待绑定函数
int tests()
{
printf("tests\n");
return 0;
}
int tests1(int a)
{
printf("tests1:%d\n",a);
return 1;
}
int tests2(int a,float aa)
{
printf("tests2:%d,%f\n",a,aa);
return 2;
}
int tests3(int a,float aa,char* p)
{
printf("tests3:%d,%f,%s\n",a,aa,p);
return 3;
}
//绑定
VE_FUNC ve_func;
fp f = std::bind(tests);
ve_func.push_back(f);
f = std::bind(tests1,12);
ve_func.push_back(f);
f = std::bind(tests2,12,11.11);
ve_func.push_back(f);
f = std::bind(tests3,13,11.22,(char*)"1233477");
ve_func.push_back(f);
//调用
for(int i=0;i < ve_func.size(); i++)
{
ret = (ve_func[i])();
printf("ret:%d\n",ret);
}
这样做出现的实际问题,
1.容器存储类型固定了,只能存储返回值类型为int的函数。
2..无法使用占位符std::placeholders::_*,动态输入参数,这点尤其重要,假如不能使用占位符动态输入参数,那这个统一调用将毫无意义。
有哪位高手对std::bind比较熟悉的,能帮忙解答下么。
解决方案
33
1.返回类型不是必须的,你可以传个引用进去
2.容器本来就是要求元素是类型一致的,你想用占位符只能把参数表弄得一致
解决这个问题你可以想个统一调用结构,或不使用function使用其他的东西
2.容器本来就是要求元素是类型一致的,你想用占位符只能把参数表弄得一致
解决这个问题你可以想个统一调用结构,或不使用function使用其他的东西
33
假如仅仅是题主上面的三个函数,找个变通的方法就可以了。
enum E_FUN_TYPE
{
e_FT_One,
e_FT_Two,
e_FT_Three
};
int tests(int a,float aa,char* p, E_FUN_TYPE eType)
{
int nResult = -1;
switch ( eTyp )
{
}
return nResult;
}
34
建议参考:boost::bind的实现;