避免使用带模板函数的if-else语句

时间:2016-12-14 11:37:14

标签: c++ templates template-specialization

如果我有这样的代码:

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语句并模拟此行为?

2 个答案:

答案 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
}

上面的好处是在找不到重载时发出编译时错误,而不是在你专门化模板函数时出现链接错误。