如何解决提升为什么我们需要泛型?
| 为什么我们需要在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);
}
可以接受吗?容器是否使用在boost :: any中实现的operator =?
any & operator=(const any &);
这使得boost ::任何能够容纳任何类型的东西吗?在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;
是语法错误,因为vector不是类(它是一个类模板,可以通过为其提供模板参数将其实例化为类)。
C ++中有某种通用类型,即void*
,但您有责任记住存储在其中的内容(尤其是出于删除目的)。 boost::any
是一种类型安全的替代方案,它会记住您存储在其中的内容,并且如果您尝试将其转换为未定义转换的内容,则会产生错误(您仍然必须向any_cast
询问实际值)。
至于operator=
,是的,它被容器使用。标准容器通常要求元素类型是默认可构造和可分配的,这意味着它们需要具有工作副本构造函数和赋值运算符。通常,它们不必是默认可构造的,或者仅在使用某些操作时才必须是默认可构造的。
, 为什么我们需要像PHP这样的脚本语言中的隐式类型?
看到一个更极端的例子。如果有人这样做,显然他们需要它。
,因为模板类型的分辨率是编译时间,而boost::any
类型
分辨率是运行时。 boost::any
是你其中的一件事
应尽可能避免,但在少数情况下应避免使用
有道理,您真的需要它-其他任何事情都不会做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。