#include <cinttypes>/span>
#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(constValue& 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 entityint 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;
}
我正試圖使用一個帶有轉換運算子的類來作為std::uint32_t(2)的索引進入一個容器類(3)。
用該類的一個實體訪問一個元素,我得到了正確的元素。
但是用static_assert和std::is_unsigned_v以及std::is_integral_v來測驗這個類,結果是斷言失敗。
我需要斷言來確保Id可以作為一個索引。
當我用std::uint32_t來static_assert時,一切都能正常作業,所以我希望轉換運算子也能作業。
uj5u.com熱心網友回復:
entity當然不是一個積分型別。它可以被轉換為一個可以作為索引的型別,這就是你所要求的:
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.
};
uj5u.com熱心網友回復:
std::is_unsigned和std::is_integral只對原始型別起作用,它對類不起作用,即使它們可以隱含地轉換為它們支持的型別。你可以通過兩種方式來解決這個問題:
創建你自己的特質:
/ ...
using uint16 = std::uint16_t。
using uint32 = std::uint32_t;
class entity { /* ...。*/ }。
template <typename T>
struct is_valid_index : std::is_unsigned< T> {};
template < >
struct is_valid_index<entity> : std::true_type {};
template <typename T>
constexpr auto is_valid_index_v = is_valid_index<T> ::value。
template<typename Id, typename Value>
class sparse_set {
static_assert(is_valid_index_v<Id>, "") 。
/ ...
};
// .../span>
完全洗掉std::is_unsigned并使用std::is_convertible代替:
#include <type_traits>/span>
/ ...
using uint16 = std::uint16_t。
using uint32 = std::uint32_t;
class entity { /* ...。*/ }。
template<typename Id, typename Value>
class sparse_set {
static_assert(std::is_convertible_v<Id, uint32>, ""/span>)。
// ...。
};
// .../span>
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331856.html
標籤:
下一篇:相同的測驗案例顯示不同的答案
