首页 > 解决方案 > 用于一系列值的模板 SFINAE 仅生成 2 个类

问题描述

我正在尝试编写一个类似位集的类,该类在内部使用一个uint32_tuint64_t成员变量进行存储,具体取决于位的特定长度。

当然,可以在模板中使用带有特殊化的 SFINAE 轻松做到这一点std::enable_ifstd::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;
}

标签: c++sfinae

解决方案


推荐阅读