将 std::list<boost::any> 作为函数的参数传递

Passing std::list<boost::any> as an argument to a function

本文关键字:参数传递 函数 gt boost std list lt any      更新时间:2023-10-16

我正在尝试将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键入到列表中的相应类型?

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

您可以手动转换它

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

您所要求的是协变列表类型。协变类型(类型构造函数)存在于某些语言中,例如 Scala;如果CovT<X>X中是协变的,并且TU的子类型(例如int将是any的子类型),则Cov<T>Cov<U>的子类型。这意味着在 Scala 中,一个类似于你的例子是可行的。

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