首页 > 解决方案 > 如何使用 typedefs 或类似的东西来重载具有有效相同签名的构造函数?

问题描述

我知道这里和那里有一些有趣的技巧可以有效地进行具有相同签名的重载。例如,您可以创建一个模板类,其中通过使用空指针来解决歧义,<typename T>因为指针类型足以区分要使用的函数。

在这里,我想要类似的东西,其中选择的构造函数重载维护基础类型 ( qreal),但附加了一个显式上下文。例如,三角形边可能属于以下三种情况:

typedef qreal Hypotenuse;
typedef qreal Side;
typedef qreal Leg;

然后当涉及到我的构造函数时,

typedef qreal Hypotenuse;
typedef qreal Side;
typedef qreal Leg;
typedef qreal Angle;
class QTriangle : QObject
{
    Q_OBJECT
public:
    enum Type
    {
        Unknown    = 0, // Two Sides Equal Length
        Isosceles  , // Two Sides Equal Length
        Right      , //
        Equilateral,
    }; Q_ENUM(Type) Q_DECLARE_FLAGS(Types, Type)

    static const QMetaEnum s_MetaType;
    explicit QTriangle( const Angle &A, const Angle &B )
        : m_A(A)
        , m_B(B)
        , m_C( 180 - A - B )
    { }
    explicit QTriangle( const Types &types, const Angle &A )
        : m_A(A)
        , m_B( types & Right ? 90     : -1 )
        , m_C( types & Right ? 90 - A : -1 )
    { }
    explicit QTriangle( const qreal &multiplier )
        : m_A( ( 180 / ( 2 + multiplier ) ) )
        , m_B( m_A )
        , m_C( m_A * multiplier )
    { }
    explicit QTriangle( const Hypotenuse &AB, const Leg &AC ) // redeclared
        : m_C(90)
    { }
    explicit QTriangle( const Leg &AC, const Leg &BC ) // Redeclared
        : m_C(90)
    { }
    


private:
    Side m_AB;
    Side m_AC;
    Side m_BC;

    Angle m_A;
    Angle m_B;
    Angle m_C;
    
    const Types m_Type{Unknown};
};

当然最后两个构造函数是重新声明,这意味着它不会编译。对我来说,为 qreal 类型提供防止构造函数重新声明所需的额外上下文的最干净的方法是什么?

标签: c++constructor-overloading

解决方案


推荐阅读