我有一個名為的類Registry,它將 ID 與一些資料相關聯。我想使存盤這些對的底層結構可以是std::map用戶可以定義的任何ish 型別(例如:std::map,std::unordered_map)。
我最初的想法是做這樣的事情:
template<typename Value, typename Container, typename ID = size_t>
class Registry{
using Storage = Container<ID, value>;
static_assert(std::is_same<Storage, std::map> || std::is_same<Storage, std::map>, "Underlying storage type must be a std::map-ish.");
public:
Storage<ID, Value> store;
...
但是,嘗試使用該類會導致錯誤:
Registry<bool, std::map> testRegistry;
err) argument list for class template std::map is missing
我理解編譯器的抱怨,但是有什么方法可以解決它,以便這種語法(或類似的東西)可以作業?
感謝您的建議。
uj5u.com熱心網友回復:
您需要宣告Container為模板模板引數。例如
template<typename Value, template <typename...> class Container, typename ID = size_t>
class Registry{
using Storage = Container<ID, Value>;
static_assert(std::is_same_v<Storage, std::map<ID, Value>> || std::is_same_v<Storage, std::unordered_map<ID, Value>>, "Underlying storage type must be a std::map-ish.");
public:
Storage store;
...
其他事宜:
Storage是一個實體化,所以不要為它指定模板引數。- 為 指定模板引數
std::map。 - 作為
static_assert您應該使用的條件std::is_same_v(或std::is_same<...>::value代替。
uj5u.com熱心網友回復:
作為替代方案,您可以僅提供容器,而不是鍵、值和模板容器:
template <typename Container>
class Registry
{
using ID = typename Container::key_type;
using Value = typename Container::mapped_type;
static_assert(std::is_same_v<Container, std::map<ID, Value>>
|| std::is_same_v<Container, std::unordered_map<ID, Value>>,
"Underlying storage type must be a std::map-ish.");
// ...
};
隨著使用
Registry<std::map<std::size_t, bool>> testRegistry;
Registry<std::unordered_map<std::size_t, float>> testRegistry2;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372496.html
上一篇:C 規范專案結構,找不到標題
