首页 > 解决方案 > 如何重载具有相同类型的构造函数?

问题描述

例如,让我们有一些用 4 个数字做一些数学运算的结构,我们想在两个构造函数中用特定值做一些特定的事情,是否可以以不使用任何附加值的方式重载构造函数(某种模式切换)?

struct Coolness
{
    float a = float();
    float b = float();
    float c = float();
    float d = float();

    Coolness(float a, float b)
    {
        /* do stuff here*/ 
    }

这里的类型相同但值不同

    Coolness(float c, float d)
    {
        /* do other stuff here*/ 
    }
};

标签: c++

解决方案


您可以使用标签结构来区分。例如,

struct Coolness {
    struct Joe{};
    struct Fonz{};

    float a = float();
    float b = float();
    float c = float();
    float d = float();

    Coolness(Joe, float a_, float b_) : a{a_}, b{b_} {
        /* do stuff here*/ 
    }

    Coolness(Fonz, float c_, float d_) : c{c_}, d{d_)} {
        /* do other stuff here*/ 
    }

    static Coolness MakeFonz(float c, float d) {
         return Coolness{Fonz{}, c, d};
    }
};

int main() {
    Coolness x{Coolness::Joe{}, 7.0f, -3.333f};
    Coolness y{Coolness::Fonz{}, 1.0f, 2.0f};
    Coolness z = Coolness::MakeFonz(3.0f, 4.0f);
}

更新:添加了一个使用示例,并添加了一个静态工厂函数来帮助说明如何使用该技术。

没有标签结构的多个静态工厂函数也可用于区分构造对象的不同方式,而不是使用任何公共构造函数。


推荐阅读