c++ - 如何使用 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 类型提供防止构造函数重新声明所需的额外上下文的最干净的方法是什么?
解决方案
推荐阅读
- vue.js - b-pagination 在第一次加载时加载所有数据(vuejs)
- vue.js - 如何在 BootstraVue b-table 中更改表头颜色
- python - 数组到矩阵的熊猫数据框
- android - Flutter SocketException:操作系统错误:没有到主机的路由,errno = 113,地址 = xxxx,端口 = 42376
- python - 正则表达式:使用单个正则表达式匹配多个字符串
- flutter - 如何使用节点 Web 服务上传 3000 个列表项?
- javascript - 在游戏中排除某个方向的问题
- sql-server - 辅助节点的 SharePoint 2013 SQL 群集问题
- javascript - HowTo 在 drawrect d3 中选择 svg 对象
- c# - 启动期间加载记录器配置需要很长时间