我记得读过一些使用新C++特性的文章来在编译时实现选择,但无法弄清楚如何去做.例如,我有一个方法执行以下操作
template<class T>
void foo()
{
if (std::is_abstract<T>::value)
do something;
else
do others.
}
Run Code Online (Sandbox Code Playgroud)
编译时间决策通常通过过载选择来完成.
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)
如果你的两个分支编译,上面的代码实际上是正常的,并将在编译时进行选择:编译器将检测到一个分支已死并且永远不会使用.优化时,没有自尊的编译器会使用分支.
特别是当分支可能无法根据类型编译时,您可以使用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)