如果我有这样的代码:
bq mk --external_table_definition=myfile.def project:dataset.table
我想避免使用if-else语句并在main函数中执行类似的操作:
void function_1(...)
{
//do something
}
void function_2(...)
{
//do something
}
int function_3(...)
{
//do something
}
int main()
{
....
if (CONSTANT_1) function_1()
else if (CONSTANT_2) function_2()
else if (CONSTANT_3) function_3()
....
}
如何避免使用if-else语句并模拟此行为?
答案 0 :(得分:2)
通常,您可以专门化功能模板:
template<int N>
void function();
template<>
void function<1>()
{
//do something
}
template<>
void function<2>()
{
//do something
}
template<>
void function<3>()
{
//do something
}
这样可行,但也可能有更好的解决方案。
答案 1 :(得分:1)
重载和标记调度。 Base模板将常量转换为唯一类型。然后简单的过载分辨率将选择适当的过载。这都是假设常量为constexpr
,而不是仅在运行时才知道。
void function(std::integral_constant<int, CONSTANT_1>)
{
//do something
}
void function(std::integral_constant<int, CONSTANT_2>)
{
//do something
}
int function(std::integral_constant<int, CONSTANT_3>)
{
//do something
}
template<int constant>
auto function()
{
return function(std::integral_constant<int, constant>{});
}
int main()
{
function<CONSTANT_2>(); // calls the second overload
}
上面的好处是在找不到重载时发出编译时错误,而不是在你专门化模板函数时出现链接错误。