如何在编译时选择方法?

use*_*020 4 c++ templates

我记得读过一些使用新C++特性的文章来在编译时实现选择,但无法弄清楚如何去做.例如,我有一个方法执行以下操作

template<class T>
void foo()
{
   if (std::is_abstract<T>::value)
         do something;
   else
         do others.
}
Run Code Online (Sandbox Code Playgroud)

Man*_*rse 7

编译时间决策通常通过过载选择来完成.

void foo_impl(std::true_type) {
    do something;
}
void foo_impl(std::false_type) {
    do others.
}

template<class T>
void foo()
{
   foo_impl(std::is_abstract<T>());
}
Run Code Online (Sandbox Code Playgroud)


Die*_*ühl 6

如果你的两个分支编译,上面的代码实际上是正常的,并将在编译时进行选择:编译器将检测到一个分支已死并且永远不会使用.优化时,没有自尊的编译器会使用分支.

特别是当分支可能无法根据类型编译时,您可以使用std::enable_if有条件地使重载可用:

template <typename T>
typename std::enable_if<std::is_abstract<T>::value>::type foo()
{
    do something
}
template <typename T>
typename std::enable_if<!std::is_abstract<T>::value>::type foo()
{
    do other
}
Run Code Online (Sandbox Code Playgroud)