在类中保留具有不同值类型的多个映射,并支持基于类型的查找
Hold multiple maps having different value types in a class and support type based lookup
我想使用具有不同值类型的多个映射来实现异构存储。我正在根据值类型对地图进行索引。为此,我使用了打字列表。这是一个简化的例子。
我的type-list
类如下所示。
namespace details
{
struct null{};
template<int N, typename E, typename T, typename ... Ts>
struct index : index<N+1, E, Ts...> {};
template<int N, typename E, typename ... Ts>
struct index<N, E, E, Ts...>
{
constexpr static int value = N;
};
template<int N, typename E>
struct index<N, E, null>
{
constexpr static int value = -1;
};
}
template<typename ... Ts>
struct typelist
{
using type = typelist<Ts...>;
template<typename T>
struct index : details::index<0, T, Ts..., details::null> {};
};
存储类实现如下,一个包含T
类型值的模板类。
#include <iostream>
#include <tuple>
#include <typeinfo>
#include <map>
template<typename T>
struct storage_impl
{
//storage_impl(storage_impl const &) = delete;
bool try_getting(int key, T &value)
{
auto search = _storage.find(key);
if(search != _storage.end() )
{
value = search->second;
return true;
}
return false;
}
std::map<int,T> _storage;
};
最后,存储管理器看起来像是,它有几个storage_impl实例,我想根据类型对它们进行索引。
struct storage_manager{
// tuple storing different storage_impls
std::tuple< storage_impl<double> , storage_impl<std::string> > storages { storage_impl<double>{},storage_impl<std::string>{} };
using item_types = typelist<double,std::string>;
storage_manager(){}
~storage_manager(){}
storage_manager(storage_manager const &) = delete;
template<typename T>
bool try_getting(int key, T &value)
{
return std::get<item_types::index<T>::value>(storages).try_getting(key,value);
}
};
int main()
{
storage_manager mgr;
double val1;
std::cout<<mgr.try_getting(123,val1);
}
直到storage_impl
变成copyable
,一切都会起作用。但我希望storage_impl
是non-copyable
。
如何在我的storage_impl
是non-copyable
的情况下实现这一点。
附言-不想使用相同的继承。
以下是我的工作代码,我已经声明cache_impls为成员变量,并为每种情况指定了专用函数storage_ref
。我只实现了try_get
,其他功能可以使用storage_ref
来实现。
#include <iostream>
#include <tuple>
#include <map>
#include <boost/noncopyable.hpp>
template<typename T>
struct storage_impl : public boost::noncopyable
{
storage_impl(){}
~storage_impl(){}
bool try_getting(int key, T &value)
{
auto search = _storage.find(key);
if(search != _storage.end() )
{
value = search->second;
return true;
}
return false;
}
bool try_setting(int key, T const &value)
{
auto search = _storage.insert(std::make_pair(key,value));
if(search.second == true )
{
return true;
}
return false;
}
bool exists(int key)
{
auto search = _storage.find(key);
if(search != _storage.end() )
{
return true;
}
return false;
}
std::map<int,T> _storage;
};
struct storage_manager : public boost::noncopyable
{
storage_impl<double> double_store;
storage_impl<std::string> string_store;
template<typename T>
struct item_return{ using type = storage_impl<T>; };
template<typename T>
typename item_return<T>::type storage_ref();
template<typename T>
bool try_getting(int key, T &value)
{
return storage_ref<T>().try_getting(key,value);
}
template<typename T>
bool try_setting(int key, T const &value)
{
return storage_ref<T>().try_setting(key,value);
}
template<typename T>
bool exists(int key)
{
return storage_ref<T>().exists(key);
}
storage_manager(){}
~storage_manager(){}
};
//double specialization
template<>
struct storage_manager::item_return<double>{ using type = storage_impl<double>&; };
template<>
inline storage_impl<double>& storage_manager::storage_ref<double>()
{
return double_store;
}
//std::string specialization
template<>
struct storage_manager::item_return<std::string>{ using type = storage_impl<std::string>&; };
template<>
inline storage_impl<std::string>& storage_manager::storage_ref<std::string>()
{
return string_store;
}
int main()
{
storage_manager mgr;
double val1 = 90;
std::cout<<mgr.try_getting(123,val1)<<'n';
std::cout<<mgr.try_setting(123,val1)<<'n';
std::cout<<mgr.exists<double>(123)<<'n';
std::string val2;
std::cout<<mgr.try_getting(123,val2)<<'n';
}
期待其他选择。。。
相关文章:
- 缺少类型说明符 - 假定为 int.注意 c++ 不支持 default-int
- 错误:C4430:缺少类型说明符-假定为int.注意:C++不支持default-int
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 如何获取具有 Freetype2 的真正类型字体支持的代码点列表 C++
- 如何根据基类型支持不同数量的参数?
- C++11: Atomic::compare_exchange_weak 是否支持非基元类型?
- boost multi_index - 如果元素类型仅支持移动语义,如何遍历它?
- 支持按值传递语句的示例不是很好的做法,即使对于小型用户定义类型也是如此
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- C++:“enable_if”用于限制支持特定算术运算的类型
- 在支持多种类型的宏中使用printf
- 如何获得支持枚举的类型
- 错误C4430:丢失类型指定词 - 假设INT.注意:C 不支持对我的构造函数的默认设置
- 是否可以在编译时测试类型是否支持负零C++
- 自动复制=按值并支持多态性的适当类型的非静态字段
- OpenCV错误:不支持的格式或格式组合(Point3f类型的点的矢量的矢量)
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- cin和cout如何支持不同的数据类型
- 为什么 std::bitset 只支持整型数据类型?为什么不支持浮点数?
- CORBA 类型支持,始终附加 :1.0