(提升)为什么我们需要泛型?

| 为什么我们需要在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
是你其中的一件事 应尽可能避免,但在少数情况下应避免使用 有道理,您真的需要它-其他任何事情都不会做。     

要回复问题请先登录注册