【发布时间】:2018-07-10 05:31:41
【问题描述】:
嗨,有没有一个容器,其中键是类型名,值是 boost 或 std 中的对象/实例?
我想要实现的是每个数据类型都有一个对象池,当我想构造该对象时,我只想通过 Key 获取。我已经有了工作代码,但如果我使用更标准的代码,我会更开心。
目前我有这样的代码:
template<size_t index, size_t counter, typename T0, typename ...T>
struct PoolBuilderInternal
{
typedef typename boost::mpl::insert<
typename PoolBuilderInternal<index - 1, counter + 1, T...>::m
, boost::mpl::pair<T0, std::integral_constant<size_t, counter> > >::type m;
};
template<size_t counter, typename T0, typename ...T>
struct PoolBuilderInternal<1, counter, T0, T...>
{
typedef typename boost::mpl::map<boost::mpl::pair<T0, std::integral_constant<size_t, counter> > > m;
};
template<typename ...T>
struct Pools
{
std::tuple<
boost::object_pool<T>...> m_pools;
typedef typename PoolBuilderInternal<sizeof...(T), 0, T...>::m poolType;
template<typename T>
boost::object_pool<T>& GetPool()
{
return std::get< boost::mpl::at<poolType, T>::type::value>(m_pools);
}
};
Pools<int, std::string, int64_t> m_pools;
m_pools.Get<int>();
编辑:我想要的是 COMPILE-TIME 地图。您可以想象一个 std::tuple 但有些不会被索引 std::get... 访问,而是通过键 (?std::tuple_map)
【问题讨论】:
-
您可以使用
typeid()::hash_code()或std::type_index()来识别类型。 -
但这些是运行时值...我想在编译时获得正确的对象池。对象池的每种类型都有不同的模板参数,因此此映射对于每个键都有不同类型的不同值
-
使用 mpl::map 将类型映射到存储类型(定义静态成员的类型)。如果你需要,多个这样的地图,你可以使用一个标签类。
-
请注意,除非您需要一些语法糖,否则它看起来有点矫枉过正。恕我直言,特征类的简单特化更具可读性。