c++ - 用于一系列值的模板 SFINAE 仅生成 2 个类
问题描述
我正在尝试编写一个类似位集的类,该类在内部使用一个uint32_t
或uint64_t
成员变量进行存储,具体取决于位的特定长度。
当然,可以在模板中使用带有特殊化的 SFINAE 轻松做到这一点std::enable_if
,std::conditional
...(请注意伪代码):
template <int N>
struct bitset
{
static constexpr int bits = N;
uint32_t value;//if N <=32 use 32 bits variable
//uint64_t value;
};
这种方法的问题是至少有与变量定义一样多的类,pg这将返回false:
std::is_same<bitset<1>, bitset<2>>::value
我想知道是否有某种方法可以以bitset
仅生成这两个最终类的方式实现:
template <int bits>
struct bitset;
struct bitset32
{
explicit bitset32(int _bits) : bits(_bits) { }
int bits;
uint32_t value;
};
struct bitset64
{
explicit bitset64(int _bits) : bits(_bits) { }
int bits;
uint64_t value;
};
旨在减少生成的类的总数和它们的通用接口。
编辑和可行的解决方案:
由用户 Igor Tandetnik 回答(对他有利)。
#include <iostream>
#include <type_traits>
struct bitset32
{
explicit bitset32(int _bits) : bits(_bits) { }
int bits;
uint32_t value;
};
struct bitset64
{
explicit bitset64(int _bits) : bits(_bits) { }
int bits;
uint64_t value;
};
template <int N>
using bitset = std::conditional_t<(N<=32), bitset32, bitset64>;
struct telegram
{
bitset<5> var1;
bitset<6> var2;
bitset<32> var3;
bitset<64> var4;
bitset<85> var5;
};
int main ()
{
std::cout << std::boolalpha << std::is_same<bitset<5>, bitset<6>>::value << std::endl;
std::cout << std::boolalpha << std::is_same<bitset<32>, bitset<33>>::value << std::endl;
}
解决方案
推荐阅读
- ggplot2 - 将 ggplot2 与 Julia pluto 笔记本一起使用
- c - valgrind C 中的 realloc 导致的内存泄漏
- java - Java 实例变量不保留状态
- c# - 在 Razor 页面 MVC5 中嵌入视频 URL
- flutter - 在 Flutter 中创建可共享的图像/证书
- python - 从 csv 导入数据,其中每个列表被分成许多行
- excel - 当不包含来自 varLists 的值时删除列/行
- c# - 如果与临时表和更改跟踪结合使用,C# yield return 会导致问题吗?
- ios - 将 Apple 健康数据链接到 firebase 用户
- javascript - Apache Royale 在项目中读取文件 javascript