我可以通过检查const integere参数来选择模板方法吗?
我需要这样的东西
template <size_t N <= 90>
void f1(){....}
template <size_t N > 90>
void f2(){....}
我的解决方案是
template <size_t N>
void f()
{
N <= 90 ? f1(N) : f2(N);
}
但是我认为这个approch并不是很好因为f()将始终在运行时调用(可能不是编译器非常聪明)。 这样想的最佳方式是什么?
答案 0 :(得分:8)
你可以试试这样一个简单的标签调度实现:
#include <type_traits>
void f(std::integral_constant<bool, true>) { /* ... */ }
void f(std::integral_constant<bool, false>) { /* ... */ }
template <std::size_t N>
void f()
{
f(std::integral_constant<bool, N <= 90>{});
}
通过将bool
类型替换为更大的整数或枚举类型并添加更多条件,可以将此方案扩展到更多条件。
答案 1 :(得分:6)
使用SFINAE和std::enable_if
直接转换:
template <std::size_t N>
typename std::enable_if<N<90, void>::type
f(){....}
template <std::size_t N>
typename std::enable_if<N>=90, void>::type
f(){....}
但是,直接的解决方案在这个例子中看起来最好。