const整数模板参数的条件

时间:2014-08-10 17:25:24

标签: c++ c++11

我可以通过检查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()将始终在运行时调用(可能不是编译器非常聪明)。 这样想的最佳方式是什么?

2 个答案:

答案 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(){....}

但是,直接的解决方案在这个例子中看起来最好。