我正在尝试将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
输入到列表中的相应类型?
答案 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
是协变的,而T
是U
的子类型(例如int
将是any
的子类型),然后Cov<T>
是Cov<U>
的子类型。这意味着在Scala中,类似于您的示例将起作用。
在C ++中,协变类型没有语言支持。某些类型(如shared_ptr
)通过用户定义的转换(例如转换构造函数)来模拟协方差。但是,std::list
不在其中。这就是您必须自己执行转换的原因。