(Boost)为什么我们需要一个泛型类型

(Boost) Why do we need a generic type?

本文关键字:泛型类型 一个 Boost 为什么 我们      更新时间:2023-10-16

为什么我们需要在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等脚本语言中需要隐式类型?

更进一步,在助推::任何例子,为什么:

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中实现的运算符=?

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就是你应尽可能避免,但在少数情况下使用有道理,你真的需要它—其他什么都做不了。