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

时间:2012-09-28 11:57:10

标签: c++ boost std

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

1 个答案:

答案 0 :(得分:2)

错误存在,因为std::list<int>无法转换为std::list<boost::any>(或std::list<T>与任何其他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不在其中。这就是您必须自己执行转换的原因。