(提升)为什么我们需要通用类型?

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

Jan*_*dec 6

因为C++并不能有泛型类型.它有类型模板,它们分别为每个替换类型编译.表达方式

vector v;
Run Code Online (Sandbox Code Playgroud)

是一个语法错误,因为vector不是一个类(它是一个类模板,可以通过给它模板参数实例化为类).

在C++中有一种通用的类型void*,但是你有责任记住你存储在其中的内容(特别是为了删除).这boost::any是一种类型安全的替代方案,它可以记住你在那里存储的内容,如果你试图将它转换为没有定义转换的东西,你会发出错误(你仍然需要通过它来询问它的实际值any_cast).

至于operator=是的,它被容器使用.标准容器通常要求元素类型是默认可构造和可分配的,这意味着它们需要具有工作副本构造函数和赋值运算符.它们通常不必是默认可构造的,或者只有在使用某些操作时才必须是默认构造.

  • @Amumu:对,对.Java有一个共同的基类`java.lang.Object`,并且它的泛型使用该基类固定在通用集合上(它们纯粹是编译时,只是自动注入适当的强制转换).相比之下,C++没有任何公共基类,很大程度上是因为公共基类只对引用语义有用,但C++默认值语义(有通用指针,`void*`,但大多数事情都不是C++中的指针) ). (2认同)