首页 > 解决方案 > 一个类中可以有多个 operator& 吗?

问题描述

我试图表达一个接口,其中两个接口组合相同的东西,并由实现继承(单一继承)。这个想法是从接口类本身继承的组合。它是这样的:

class A_interface;
class B_interface {
public:
    B_interface(const B_interface& a) = delete;
    B_interface& operator=(const B_interface& a) = delete;
    virtual operator A_interface&() = 0;
protected:
    B_interface() = default;
};

class A_interface {
public:
    A_interface(const A_interface& a) = delete;
    A_interface& operator=(const A_interface& a) = delete;
    virtual operator B_interface&() = 0;
    void afunc()
    {
        printf("Hello from base A\n");
    }
protected:
    A_interface() = default;
};

class B_Impl;
class A_Impl: public A_interface {
public:
    operator B_Impl&();
    virtual operator B_interface&() override;
protected:
    friend B_Impl;
    A_Impl() = default;
};

class B_Impl:public B_interface {
public:
    B_Impl()=default;
    operator A_Impl&();
    virtual operator A_interface&() override;
private:
    A_Impl a;
};


A_Impl::operator B_Impl&()
{
    printf("Hello from A_Impl::operator B_Impl&\n");
    return *(B_Impl*)(((uint8_t*)this)-offsetof(B_Impl, B_Impl::a));
}

A_Impl::operator B_interface&()
{
    printf("Hello from A_Impl::operator B_interface&\n");
    return A_Impl::operator B_Impl&();
}

B_Impl::operator A_Impl&()
{
    printf("Hello from B_Impl::operator A_Impl&\n");
    return a;
}

B_Impl::operator A_interface&()
{
    printf("Hello from B_Impl::operator A_interface&\n");
    return B_Impl::operator A_Impl & ();
}

现在从外部代码:

B_Impl b;
b.operator A_interface &().operator B_interface &().operator A_interface &().afunc();
A_interface& a1 = b;

输出是:

Hello from B_Impl::operator A_interface&
Hello from B_Impl::operator A_Impl&
Hello from A_Impl::operator B_interface&
Hello from A_Impl::operator B_Impl&
Hello from B_Impl::operator A_interface&
Hello from B_Impl::operator A_Impl&
Hello from base A
Hello from B_Impl::operator A_interface&
Hello from B_Impl::operator A_Impl&

现在的问题是:我需要重载什么才能使以下代码正常工作?

A_interface* a2 = &b;

标签: c++

解决方案


文字重载需要一个参数来重载,但这是一元 operator&的。您似乎想重载返回类型,而不是参数。

为此,您需要返回一个代理类型,它对A_interface*和都有隐式转换B_interface*。这些必须是代理的成员,因为您显然不能将构造函数添加到A_interface*. 指针是内置类型,没有任何成员函数,更不用说用户定义的成员类型了。


推荐阅读