我需要一个支持从任何类型到任何类型的映射的映射。
正如标题所说,任何类型都意味着(除其他外)矢量、地图、所有类型的数字等。
我考虑编写某种包装器,正如我在这里(http://www.parashift.com/c++-faq-lite/heterogeneous-list.html)发现的那样,映射需要包含异构类型(实际上数组需要,但是映射是关联数组)。
对此有什么想法,或者我的方法应该是什么?
谢谢
我需要一个支持从任何类型到任何类型的映射的映射。
正如标题所说,任何类型都意味着(除其他外)矢量、地图、所有类型的数字等。
我考虑编写某种包装器,正如我在这里(http://www.parashift.com/c++-faq-lite/heterogeneous-list.html)发现的那样,映射需要包含异构类型(实际上数组需要,但是映射是关联数组)。
对此有什么想法,或者我的方法应该是什么?
谢谢
如果您不能使用 boost,您可以编写自己的“变体”类型。
这将包含:
鉴于您希望能够将其用于地图的键和值,您必须operator<
在变体类型或其他可用于地图的严格排序谓词上进行定义。
请注意,您的地图将能够包含您喜欢的任何类型,只要您为您的类型提供一个键,以及该类型与您的地图实际存储的不透明数据结构之间的转换器。您还需要在某种表格上注册您的类型。
使用boost::variant
,您可以使用的所有类型都是“注册的”。使用boost::any
,类型未注册,但在提取时,您需要知道您期望找到的类型。这些都不能用于映射的键,但它们可以用于值。
boost-any 模型不使用任何类型的变量来表示类型。相反,您有一个类似这样的模型(可能更好地实现)
class AbstractBase
{
public:
virtual ~AbstractBase() {}
};
template< typename T >
struct AnyImpl : public AbstractBase
{
T t;
};
typedef shared_ptr< AbstractBase > AbstractBasePtr;
class Any
{
AbstractBasePtr ptr;
public:
bool cast( T & t ) const
{
shared_ptr<AnyImpl<T>> tptr = pointer_cast< AnyImpl<T> >( ptr );
if( tptr )
{
t = tptr->t;
return true;
}
else
return false;
}
};
好的,所以我创建了一个基类,您可以从中派生任何类型的持有者,然后您可以存储指向它的共享指针,因为它们是异构的,然后您可以尝试将它们转换为您想要的类型。
也许是一个有用的学习练习。实际上,与 boost 相比,可能实施得不好。
“派生”的持有者不持有“基”类型,如果您想要指针,您现在将指针包装在不是很好的指针中。您的类型必须是可复制和可分配的。但是,它可能会起作用。
的方法之一是针对 std::map 的要求"mappings from any type to any type"
实施专门化。any types
例如,比较键或复制构造函数的值,例如:
temaplate <typename T>
class MapKey { };
temaplate <typename T>
class MapValue { };
并定义您的地图,例如:
template <typename TKey, typename TValue>
class Map : public std::map< MapKey<TKey>, MapValue<TValue> >
{ /* map methods */ };
要std::vector<int>
用作键,Map
您需要实现专业化MapKey<std::vector<int>>