我想定义一个函数void f(int i)
,该函数仅在被称为f(1)
时才能编译并执行某些操作,而在所有其他情况下都会导致编译错误。可以使用模板专门化吗?
答案 0 :(得分:0)
正如您在评论中提到的那样,您不希望使用模板,并且根据那里提到的要求,一个选项可能使用enum
作为参数,这意味着您将输入限制为给定参数集:
enum argument{option1,option2,option3};
void f(argument x){
// do stuff
}
(该示例使用了三个允许的值,但是您可以使用任意数量的可能值)
虽然与您要求的不完全相同(f
的签名已更改),但它基本上具有相同的目的。
您现在可以使用f
,option1
或option2
作为输入(或您在option3
中指定的任何其他输入)来调用argument
。由于enum
可隐式转换为int
,因此您可以在函数主体中使用它,并直接在argument
中指定可能的值
enum argument{option1=20,option2=23,option3=12};
请注意,即使可以将arguments
隐式转换为int
,它也无法正常工作,因此您将无法直接在{{1 }}输入,这就是为什么它与您要求的不完全相同的原因。
请注意,尽管您可以使用f
将int
转换为static_cast
,但这很危险,因为它将再次编译任何输入,甚至可能根据值调用UB。你投。