c++ - C ++使用带有转换运算符的类作为数组的索引
问题描述
#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
to std::uint32_t
(2) 的类作为容器类 (3) 的索引。使用该类的实例访问元素是可行的,我得到了正确的元素。
但是用static_assert
andstd::is_unsigned_v
和 and测试类std::is_integral_v
会导致断言失败。
我需要断言以确保Id
可以用作索引。
当我一切正常时static_assert
,std::uint32_t
我希望转换运算符也能正常工作。
解决方案
entity
当然不是整数类型。它可以转换为可以用作索引的类型,这就是您所需要的:
#include <type_traits>
template<typename Id, typename Value>
class sparse_set {
static_assert(std::is_convertible_v<Id,size_t>, "");
// class implementation left out
};
推荐阅读
- python - dyld:库未加载:/usr/local/opt/gcc/lib/gcc/9/libquadmath.0.dylib
- r - R 中的 If Else 语句 - else 中的意外 else
- c# - Kentico 通过选定的 smtp 服务器发送电子邮件
- jquery - 如何使用巧克力 jquery 在容器中设置当前图像?
- reactjs - 尝试获取资源时出现 NetworkError。(Spring Boot / 安全 / React / Redux)
- c# - 如何使用 Node 和 C# 通过 TCP 向客户端发送一个简单的 UInt
- maven - 如何阻止maven下载源jar
- css - 每次组件重新渲染时如何生成一个随机数?
- angular - Angular Universal 中的 gzip
- acumatica - 无法更新案例中的原因下拉列表值