类模板中的C++std::enable_if,用于成员函数
C++ std::enable_if in a class template, for a member function
问题很简单。我有一个包含保护的头文件和一个实现文件impl。头文件包含实现文件。我想做以下事情:
头文件:
template<size_t N>
class A
{
void func();
};
impl文件:
template<size_t N>
typename std::enable_if<(N <= 5), void>::type A<N>::func() { ... }
template<size_t N>
typename std::enable_if<(N > 5), void>::type A<N>::func() { ... }
然而,我还不擅长std::enable_if
,而且似乎找不到func
的原型,因为我通过更改返回类型来更改函数签名。如何在为用户提供一个接口功能的同时实现不同的功能。
这本质上是MCU寄存器修改器,它对两个寄存器进行操作,因为其中一个寄存器没有容量。我宁愿不在函数内部使用任何基于N的脏偏移,而是依赖于普通结构。此外,我宁愿不使用辅助函数,如果没有它们的话,这会使事情变得复杂。
您可以使用标签调度:
template <size_t N>
class A
{
void func()
{
do_func(std::integral_constant<bool, (N > 5)>{});
}
void do_func(std::true_type) { /* handles the N > 5 case */ }
void do_func(std::false_type) { /* handles the N <= 5 case */ }
};
您可以委托:
#include <iostream>
template<std::size_t N>
class A
{
private:
template <std::size_t I>
typename std::enable_if<(I <= 5)>::type
f() { std::cout << "Smalln"; }
template <std::size_t I>
typename std::enable_if<(I > 5)>::type
f() { std::cout << "Bign"; }
public:
void func() { f<N>(); }
};
int main()
{
A<1> small;
small.func();
A<10> big;
big.func();
}
如果你信任你的编译器优化:
template<std::size_t N>
class A
{
private:
void small() { std::cout << "Smalln"; }
void big() { std::cout << "Bign"; }
public:
void func() {
if(N <= 5) small();
else big();
}
};
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- Insert函数不适用于2 if语句C++
- 为什么这个if(s[j]==s[i] && i>0)条件不适用于这个[{()}]
- 为什么我的 if 语句不适用于 c++ 中的字符串?
- c++:用于短路的 if 块语法中的多重赋值
- C 用于IF-Statments和while-loops的短路
- 用于循环,if表示Ardiuno驱动湿度控制的说明
- 为什么我的if语句不适用于循环
- if(a == b) 不适用于 for 循环中的双精度
- 用于打印工作人员名称的If语句
- if 语句不适用于函数
- if语句不适用于||(或)
- "warning: operation of ... may be undefined"用于三元操作 - 不是if/else块
- 如何有效地将if和else用于筛选构造
- 忽略用于气泡排序的 if 语句