【发布时间】:2021-03-16 17:42:35
【问题描述】:
C++17(或更早版本但不是 c++20)是否允许这样做?
我需要一个 type_traited 条件类,例如具有内部 32 或 64 无符号整数存储的位集,具体取决于模板参数 N 是否小于 32 或更大(请忘记超过 64 位)。
但约束是最终为所有可能的情况实现两个且仅两个类。下一个源代码使用静态和运行时间断言来定义问题:
Coliru 链接:http://coliru.stacked-crooked.com/a/d53a5b00bd828fb5
#include <cassert>
#include <iostream>
#include <type_traits>
struct bitset32
{
bitset32() : bits(0) { }
bitset32(int _bits) : bits(_bits) { }
const int bits;
uint32_t value;
};
struct bitset64
{
bitset64() : bits(0) { }
bitset64(int _bits) : bits(_bits) { }
const int bits;
uint64_t value;
};
template <int N>
using bitset = std::conditional_t<(N<=32), bitset32, bitset64>;
int main ()
{
static_assert(std::is_same<bitset<1>, bitset<2>>::value);
static_assert(std::is_same<bitset<33>, bitset<34>>::value);
static_assert(!std::is_same<bitset<1>, bitset<33>>::value);
bitset<1> var1;
bitset<15> var2;
bitset<32> var3;
bitset<64> var4;
assert(var1.bits == 1);
assert(var2.bits == 15);
assert(var3.bits == 32);
assert(var4.bits == 64);
}
欢迎任何解决方案,即使它更改了基本类型并使用继承或任何其他必要的机制,但请不要使用模板函数返回template<int N> make_bitset { return Bitset<N>(N); } 样式的对象,因为它需要实现变量使用这个构造 Bitset<N> variable_name。
【问题讨论】:
-
不可能。如果
bitset<1>和bitset<15>是同一类型,则需要将值传递给构造函数。如果没有...将值传递给构造函数,这是不可能的。 -
是的,没错,但我想知道在现代 c++ 中,模板是否可以以我不知道的方式将参数传递给构造函数,但也许你是对的,这是不可能的
-
std::is_same<bitset<1>, bitset<2>>::value要求bitset<1>和bitset<2>具有完全相同的最派生类型,因此位计数不能在该类型中。并且没有信息传递给构造函数,因此位计数 必须 在类型中。我们可以放松is_same检查吗? -
这也是XY problem。为什么要达到这些要求?你需要修复那个
-
@Pablo:你要求的东西是不可能的。 This 与您将得到的一样接近。
标签: c++ templates c++17 template-argument-deduction