0

我正在尝试将boost::any对象列表传递给函数。

这是我的尝试:

typedef std::list<boost::any> Any_List_Type;
typedef std::list<int> Int_List_Type;

void printAnyListSize(Any_List_Type anyListType)
{
   printf("Any list size(%d) \n", anyListType.size();
   return;
}

void showInstListSize(Int_List_Type intListType)
{
   printAnyListSize(intListType);  //compile error...
}

由于 boost::any 允许在列表中传递任何类型,我不确定为什么会出现错误。

如何将类型boost::any转换为列表中的适当类型?

4

1 回答 1

2

存在错误是因为std::list<int>无法转换为std::list<boost::any>(或std::list<T>与任何其他T,例如unsigned)。

你可以手动转换

 printAnyListSize(Any_List_Type(intListType.begin(), intListType.end()));

您要求的是协变列表类型。协变类型(类型构造函数)存在于某些语言中,例如 Scala;如果 aCovT<X>是协变的X并且T是 的子类型U(例如int是 的子类型any),则Cov<T>是 的子类型Cov<U>。这意味着在 Scala 中,可以使用类似于您的示例。

在 C++ 中,没有对协变类型的语言支持。某些类型(如shared_ptr)通过用户定义的转换(例如转换构造函数)来模拟协方差。然而,std::list不在其中。这就是您必须自己执行转换的原因。

于 2012-09-28T12:04:50.960 回答