64,648
社区成员
发帖
与我相关
我的任务
分享
class A
{
public:
template<typename _f>
void set(_f f)
{
fun1 = f;
}
std::function<void()> fun1;
};
void f1()
{
}
void f2(int a)
{
}
A a;
a.set(std::bind(f1));
a.set(std::bind(f2)); // 编译时这里会报错,找不到匹配的函数
class A
{
public:
template<typename _handler>
set_callback(_handler h)
{
f_ = h;
}
FUN f_;
}
用户只需要调用这唯一的一个设置函数就行了,类似这样调用:
set_callback(std::bind(userfun,std::placeholders::_1,std::placeholders::_2,"abc",10));
用户的回调函数参数不定,返回值也不定,上面有人说“如果保存下来的函数参数都不一样, 你怎么去调用保存下来的函数? ”,其实我调用用户的回调函数时,参数已经是固定的了,比如上面的例子std::bind(userfun,std::placeholders::_1,std::placeholders::_2,"abc",10));,我调用回调时是会传入前两个参数的,后两个参数已经bind进去了,问题就出在我没法用类似std::function<void(int a)>这样的成员变量来存储用户回调函数。
你的A<void,int> a2;这种办法虽然可行,但增加了复杂度,做成模板参数,让用户来设定模板参数,还是不友好。template<typename Return,typename... Args>
class A
{
typedef std::function<Return(Args...)> Func;
public:
void set(Func f)
{
fun1 = f;
}
Func fun1;
};
void f1()
{
}
void f2(int a)
{
}
void main()
{
A<void> a1;
a1.set(f1);
A<void,int> a2;
a2.set(f2);
}
class A
{
public:
template<typename _f>
void set(_f f)
{
fun1 = &f;
}
void* fun1;
};
void f1()
{
}
void f2(int a)
{
}
int main()
{
A a;
a.set(std::bind(f1));
a.set(std::bind(f2)); // 编译时这里会报错,找不到匹配的函数
}
如果保存下来的函数参数都不一样, 你怎么去调用保存下来的函数? 保存下来又无法使用, 保存又有什么意义呢