const整型模板形参的条件
Condition for const integer template parameter
我可以通过检查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(){....}
在这个例子中,直接的解决方案似乎是最好的。
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- const整型模板形参的条件
- 使用作为模板形参提供的基类成员,不带限定符
- 模板类的不同返回类型取决于类的形参
- 模板形参有二义性:无法推断模板实参
- 是否有必要在定义中使用模板形参来引用同一个类?
- c++ std::find()和模板形参