const整型模板形参的条件

Condition for const integer template parameter

本文关键字:条件 形参 整型 const      更新时间:2023-10-16

我可以通过检查const整型参数来选择模板方法吗?

我需要这样的东西

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);
}

但是我认为这种方法不是很好,因为f()总是在运行时调用(如果编译器非常聪明的话可能不是)。这样思考的最好方式是什么?

您可以尝试这样一个简单的标记分派实现:

#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类型替换为更大的整型或enum类型并添加更多条件来扩展此方案,以满足更多条件。

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

在这个例子中,直接的解决方案似乎是最好的。