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(蹦床);
}
换句话说,与其对函数进行强制转换,不如定义一个对参数执行强制转换的新函数