例如,让我们有一个结构用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*/
}
};
答案 0 :(得分:2)
您可以使用标签结构来区分。例如,
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);
}
更新:添加了一个使用示例,并添加了静态工厂函数来帮助说明如何使用该技术。
没有标签结构的多个静态工厂函数也可以用于区分构造对象的不同方式,而不是使用任何公共构造函数。
答案 1 :(得分:2)
您不能有多个具有相同签名的重载。
另一种方法是创建为您创建对象的静态方法。例如,如果您创建了自己的Complex
类,则可以使用静态方法从实部和虚部创建复数,然后可以使用另一种静态方法来创建通过绝对值和相位的对象