0

我需要一个支持从任何类型到任何类型的映射的映射。

正如标题所说,任何类型都意味着(除其他外)矢量、地图、所有类型的数字等。

我考虑编写某种包装器,正如我在这里(http://www.parashift.com/c++-faq-lite/heterogeneous-list.html)发现的那样,映射需要包含异构类型(实际上数组需要,但是映射是关联数组)。

对此有什么想法,或者我的方法应该是什么?

谢谢

4

2 回答 2

1

如果您不能使用 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 相比,可能实施得不好。

“派生”的持有者不持有“基”类型,如果您想要指针,您现在将指针包装在不是很好的指针中。您的类型必须是可复制和可分配的。但是,它可能会起作用。

于 2013-11-12T12:36:07.787 回答
0

的方法之一是针对 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>>

于 2013-11-12T13:49:46.427 回答