【发布时间】:2021-09-21 10:47:26
【问题描述】:
#include <cinttypes>
#include <type_traits>
template<typename Id, typename Value>
class sparse_set {
static_assert(std::is_integral_v<Id>, ""); (1)
static_assert(std::is_unsigned_v<Id>, "");
Value& operator[](Id id);
void push_back(const Value& value);
// class implementation left out
};
class entity {
public:
explicit entity(std::uint32_t id) : _id(id) {}
~entity() = default;
std::uint32_t id() const {
return _id;
}
operator std::uint32_t() const { (2)
return _id;
}
private:
std::uint32_t _id;
}; // class entity
int main() {
const auto e = entity{2};
auto set = sparse_set<entity, int>{};
set.push_back(0);
set.push_back(1);
set.push_back(2);
set.push_back(3);
auto i = set[e]; (3)
return 0;
}
我正在尝试使用具有 conversion operator 到 std::uint32_t (2) 的类作为容器类 (3) 的索引。
使用该类的实例访问元素是可行的,我得到了正确的元素。
但是使用 static_assert 和 std::is_unsigned_v 和 std::is_integral_v 测试类会导致断言失败。
我需要断言来确保Id 可以用作索引。
当我 static_assert 和 std::uint32_t 一切正常时,我希望转换运算符也能正常工作。
【问题讨论】:
-
entity(Id) 是整数类型吗?我不这么认为。 -
不,
static_assert(std::is_integral_v<entity>);会抱怨。 "提供等于true的成员常量value,如果T的类型为bool,char,char8_t(C++20起),char16_t,@ 987654339@、wchar_t、short、int、long、long long,或任何实现定义的扩展整数类型,包括任何有符号、无符号和 cv 限定的变体。否则,值等于false.”。另请注意:“为is_integral或is_integral_v(C++17 起)添加特化的程序的行为未定义。” -
您的代码有几个与问题无关的错误。请修复它们并添加必要的包含
标签: c++ conversion-operator array-indexing