C++ 如何在新设计中迁移需要两个额外参数的函数

C++ 如何在新设计中迁移需要两个额外参数的函数,c++,C++,我们有一个现有的类方法,它接受两个字符串作为参数: bool myfunc(const std::string& var1, const std::string& var2) bool myfunc(const std::string& var1, const std::string& var2, int& var3, int& var4) 许多地方都引用了相同的函数。现在,我需要对其进行修改,以传递另外两个整数参数: bool myfunc(

我们有一个现有的类方法,它接受两个字符串作为参数:

bool myfunc(const std::string& var1, const std::string& var2)
bool myfunc(const std::string& var1, const std::string& var2, int& var3, int& var4)
许多地方都引用了相同的函数。现在,我需要对其进行修改,以传递另外两个整数参数:

bool myfunc(const std::string& var1, const std::string& var2)
bool myfunc(const std::string& var1, const std::string& var2, int& var3, int& var4)
我尝试使用varadic参数/函数模板,但在这两种情况下,我都需要修改现有的实现——也许我不确定确切的实现。我也不希望使用默认参数——我们使用的是C++11


有没有一种方法可以创建一个函数模板,该模板可以通过传递两个或四个参数来调用?

我认为模板在这方面做得过火了。如果您想要一个函数有两个不同的有效版本,只需为该函数创建两个不同的有效版本即可

bool myfunc(const std::string& var1,
            const std::string& var2) {
  // Original implementation
}

bool myfunc(const std::string& var1,
            const std::string& var2,
            int& var3,
            int& var4) {
  // Awesome, cool stuff :)
}
如果两者做相同的事情(假设前者假装有默认参数,等等),您可以让它们进行委托

bool myfunc(const std::string& var1,
            const std::string& var2) {
  return myfunc(var1, var2, some_value, some_other_value);
}

bool myfunc(const std::string& var1,
            const std::string& var2,
            int& var3,
            int& var4) {
  // Awesome, cool stuff that works in general :)
}

我认为模板在这里太过分了。如果您想要一个函数有两个不同的有效版本,只需为该函数创建两个不同的有效版本即可

bool myfunc(const std::string& var1,
            const std::string& var2) {
  // Original implementation
}

bool myfunc(const std::string& var1,
            const std::string& var2,
            int& var3,
            int& var4) {
  // Awesome, cool stuff :)
}
如果两者做相同的事情(假设前者假装有默认参数,等等),您可以让它们进行委托

bool myfunc(const std::string& var1,
            const std::string& var2) {
  return myfunc(var1, var2, some_value, some_other_value);
}

bool myfunc(const std::string& var1,
            const std::string& var2,
            int& var3,
            int& var4) {
  // Awesome, cool stuff that works in general :)
}

我知道您不想使用默认值,但是C++11确实支持它们,而且由于您不希望添加多个签名,我相信这是最简单的解决方案

static int DEFAULT_VAL = 2;
bool myfunc(const std::string& var1,
            const std::string& var2,
            int& var3=DEFAULT_VAL,
            int& var4=DEFAULT_VAL) {
    // Function implementation
};
使用这些默认参数,可以传递2个或4个参数。这两个例子都适用:

// Two arguments
myfunc(str1, str2);

// Four arguments
myfunc(str1, str2, int1, int2);

您还可以检查整数是否等于默认值,以确定使用了多少个参数。

我知道您不想使用默认值,但是C++11确实支持它们,而且由于您不希望添加多个签名,我相信这是最简单的解决方案

static int DEFAULT_VAL = 2;
bool myfunc(const std::string& var1,
            const std::string& var2,
            int& var3=DEFAULT_VAL,
            int& var4=DEFAULT_VAL) {
    // Function implementation
};
使用这些默认参数,可以传递2个或4个参数。这两个例子都适用:

// Two arguments
myfunc(str1, str2);

// Four arguments
myfunc(str1, str2, int1, int2);


您还可以检查整数是否等于默认值,以确定使用了多少参数。

C++11具有默认参数。即使没有它们,你就不能让它过载吗?我不知道你为什么要问函数模板?这难道不能通过正常的函数重载来实现吗?这将导致代码重复,而事实上我们需要传递额外的arguments@Programmer您可以从一个重载调用另一个重载,或者让两个重载调用一个单独的“实现”函数以避免代码重复。我需要捕获使用实际方法实现计算的整数值-因此实际值需要修改DC++11具有默认参数。即使没有它们,你就不能让它过载吗?我不知道你为什么要问函数模板?这难道不能通过正常的函数重载来实现吗?这将导致代码重复,而事实上我们需要传递额外的arguments@Programmer您可以从一个重载调用另一个重载,或者让两个重载调用一个单独的“实现”函数以避免代码重复。我需要捕获使用实际方法实现计算的整数值-因此需要修改实际的整数值,但我还需要传递两个整变量以捕获原始实现的返回值,如果有两个函数实现相同的代码,则会生成代码重复和额外维护是什么阻止了你从一个委派到另一个?如果实现是不同的,那么当然你必须两者都有。如果他们正在做同样的工作,你应该能够委托,就像我在第二个例子中所做的那样。我同意,但如果我们以这种方式实现,那么我们将根据要传递的参数创建更多相同函数的实例。因此,出于遗留原因,你想支持旧接口,但你不想定义新接口?对不起,恐怕你要失去我了。如果你想有两个不同的函数签名,那么你需要两个不同的函数。即使你用模板把它拼凑在一起,你最终还是会得到两个不同的函数,模板就是这样做的。谢谢你的帮助。是的,函数模板可以解决问题,但不同的实现将在运行时进行评估,并且只有一个实现-这就是我在如何实现函数模板方面失败的地方,但我还需要传递两个整数变量,以捕获原始实现的返回值,并具有两个函数实现相同的代码会导致代码重复和额外的维护是什么阻止了您从一个委派到另一个?如果实现是不同的,那么当然你必须两者都有。如果他们正在做同样的工作,你应该能够委托,就像我在第二个例子中所做的那样。我同意,但如果我们以这种方式实现,那么我们将根据要传递的参数创建更多相同函数的实例。因此,出于遗留原因,你想支持旧接口,但你不想定义新接口?对不起,恐怕你要失去我了。如果你想有两个不同的函数签名,那么你需要两个不同的函数。即使你用模板把它拼凑在一起,你最终还是会得到两个不同的函数,模板就是这样做的。谢谢你的帮助。是的,函数模板可以解决问题,但是不同的实现将在运行时进行评估,并且只有一个实现-这就是我在如何实现函数模板方面失败的地方谢谢-我正在尝试避免使用默认值arguments@Programmer啊我看到你在你的问题里写了,我读得太快了谢谢-我正在努力避免使用默认值arguments@Programmer啊,我看到你在你的问题中写的,我读得太快了