有没有什么方法可以更有效地使用“删除”而不是一一删除?

kim*_*ims 1 c++

我正在尝试创建仅获取 int 参数的函数。因此,当包含其他类型(double、char、bool)时,我通常delete会像下面的代码一样排除它:

#include <iostream>

using namespace std;

int add_int(int x, int y){
    return x + y;
}

int add_int(double, double) = delete;
int add_int(int, double) = delete;
int add_int(double, int) = delete;
int add_int(bool, int) = delete; // need much more code.. very inefficient

int main(void){
    cout << add_int(1, true) << endl; // error should happen
}
Run Code Online (Sandbox Code Playgroud)

但我觉得这样效率太低了。有没有像“仅可能是 int”或“排除 double、char、bool(我的意思是只输入一个参数)”之类的方法?

pad*_*ddy 7

是的,您可以使用删除所有内容的函数模板。

template<class X, class Y>
int add_int(X, Y) = delete;
Run Code Online (Sandbox Code Playgroud)

现在,当编译器解析函数调用时,它将选择模板,除非存在不需要隐式类型转换的函数重载。将优先选择不需要转换的重载而不是模板函数。

更多信息请参见:过载解决方案

如果您愿意,您还可以通过添加专业化来使您的实现成为此模板的一部分:

template<>
int add_int(int x, int y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

  • @kims如果删除`template&lt;&gt;`,您将不再拥有模板专业化,而是*重载*。 (2认同)
  • 请注意,此“template&lt;&gt;”的存在或不存在实际上会产生两个完全不同的事物,但它们在这里的行为恰好相同。使用“template&lt;&gt;”,您可以声明一个模板特化,一旦通过重载解析选择了主模板并推导出了“X”和“Y”,就会考虑该模板特化,并且如果两者都是“int”,则将匹配。如果没有,您将声明一个单独的(但重载)函数,如果不需要转换参数,则重载解析将首选该函数。 (2认同)