C++ 实现接受回调的常量和非常量版本的方法
我有以下界面:C++ 实现接受回调的常量和非常量版本的方法,c++,c++11,lambda,const-cast,C++,C++11,Lambda,Const Cast,我有以下界面: struct A {}; struct B { using Cb = std::function<void(A& a)>; using ConstCb = std::function<void(const A& a)>; virtual void visit(ConstCb cb) const = 0; virtual void visit(Cb cb) = 0; }; 然而,这一缺失似乎是不可能的。我
struct A {};
struct B
{
using Cb = std::function<void(A& a)>;
using ConstCb = std::function<void(const A& a)>;
virtual void visit(ConstCb cb) const = 0;
virtual void visit(Cb cb) = 0;
};
然而,这一缺失似乎是不可能的。我可以使用std::function::target()
获取函数指针cb
,然后尝试将其强制转换为其他类型。但这是不可能的,因为target()
不适用于lambda,它们不能转换为函数指针(只有在它们有空捕获时)
所以我现在想不出解决办法。有人有什么想法吗?也许整个方法已经存在缺陷:D一个选项是引入一个“蹦床”功能,将非
const
转换为const
:
void B::f(Cb cb)
{
ConstCb trampoline = [&cb] (const A& arg) {
cb(const_cast<A&>(arg));
};
static_cast<const B*>(this)->f(trampoline);
}
void B::f(Cb)
{
康斯坦布蹦床=[&cb](康斯坦布A&arg){
cb(const_cast(arg));
};
静态抛投(本)->f(蹦床);
}
换句话说,与其对函数进行强制转换,不如定义一个对参数执行强制转换的新函数。一个选项是引入一个“蹦床”函数,将非常量转换为常量:
void B::f(Cb cb)
{
ConstCb trampoline = [&cb] (const A& arg) {
cb(const_cast<A&>(arg));
};
static_cast<const B*>(this)->f(trampoline);
}
void B::f(Cb)
{
康斯坦布蹦床=[&cb](康斯坦布A&arg){
cb(const_cast(arg));
};
静态抛投(本)->f(蹦床);
}
换句话说,与其对函数进行强制转换,不如定义一个对参数执行强制转换的新函数