Amu*_*umu 1 c++ boost type-conversion
为什么我们需要Boost库中指定的泛型类型?模板不够吗?例如,如果我想要一个特定类型的容器,我会这样做:
template<class Type>
vector<Type> v;
Run Code Online (Sandbox Code Playgroud)
如果我想指定一个包含所有内容的容器,我只需写:
vector v;
Run Code Online (Sandbox Code Playgroud)
解释为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);
}
Run Code Online (Sandbox Code Playgroud)
可以接受吗?容器是否使用operator ::在boost :: any中实现?
any & operator=(const any &);
Run Code Online (Sandbox Code Playgroud)
这使得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
因为C++并不能有泛型类型.它有类型模板,它们分别为每个替换类型编译.表达方式
vector v;
Run Code Online (Sandbox Code Playgroud)
是一个语法错误,因为vector不是一个类(它是一个类模板,可以通过给它模板参数实例化为类).
在C++中有一种通用的类型void*,但是你有责任记住你存储在其中的内容(特别是为了删除).这boost::any是一种类型安全的替代方案,它可以记住你在那里存储的内容,如果你试图将它转换为没有定义转换的东西,你会发出错误(你仍然需要通过它来询问它的实际值any_cast).
至于operator=是的,它被容器使用.标准容器通常要求元素类型是默认可构造和可分配的,这意味着它们需要具有工作副本构造函数和赋值运算符.它们通常不必是默认可构造的,或者只有在使用某些操作时才必须是默认构造.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |