为什么我们需要Boost库中指定的泛型类型?模板不够吗?例如,如果我想要一个特定类型的容器,我会这样做:
template<class Type>
vector<Type> v;
如果我想指定一个包含所有内容的容器,我只需写:
vector v;
解释为boost :: any(http://www.boost.org/doc/libs/1_46_1/doc/html/any/s02.html)
转换可以包含多种可能值类型之一的类型,例如int和string,并在它们之间自由转换,例如将5解释为“5”,反之亦然 . 这些类型在脚本和其他解释语言中很常见 . boost :: lexical_cast支持这种转换功能 .
为什么我们需要类似PHP等脚本语言的隐式类型?
此外,在boost :: any示例中,为什么:
using boost::any_cast;
typedef std::list<boost::any> many;
void append_int(many & values, int value)
{
boost::any to_append = value;
values.push_back(to_append);
}
可以接受吗?容器是否使用operator ::在boost :: any中实现?
any & operator=(const any &);
这使得boost :: any能够持有任何类型? operator =在boost :: any中定义的解释如下:
效果:将rhs的内容复制到当前实例中,丢弃以前的内容,以使新内容在类型和值上与rhs的内容相同,如果为rhs.empty()则为空 . 抛出:std :: bad_alloc或由包含类型的复制构造函数引起的任何异常 . 作业满足了异常安全的有力保证 .
http://www.boost.org/doc/libs/1_46_1/doc/html/boost/any.html
3 回答
因为模板类型解析是编译时,而
boost::any
类型解析是运行时 .boost::any
是你应该尽可能避免的事情之一,但在少数情况下,它的使用是合理的,你真的需要它 - 没有别的办法 .因为C确实 not 具有泛型类型 . 它有类型模板,分别为每个替换类型编译 . 表达方式
是一个语法错误,因为vector不是一个类(它是一个类模板,可以通过给它模板参数实例化为类) .
在C中有一个有点泛型的类型,
void*
,但是你有责任记住你存储在其中的内容(特别是为了删除) .boost::any
是一种类型安全的替代方案,可以记住你在那里存储的内容,并且如果你试图将它转换为没有定义转换的东西会给出错误(你仍然需要通过any_cast
询问它的实际值) .至于
operator=
,是的,它被容器使用 . 标准容器通常要求元素类型是默认可构造和可分配的,这意味着它们需要具有工作副本构造函数和赋值运算符 . 它们通常不必是默认构造,或者只有在使用某些操作时才必须是默认构造 .查看更多extreme example . 如果有人这样做,显然他们需要它 .