2011-05-24 40 views
1

为什么我们需要在Boost库中指定的泛型类型?模板不够吗? 个例子,假如我想要一个特定类型的容器,我只想做:(Boost)为什么我们需要一个泛型?

template<class Type> 
vector<Type> v; 

如果我想指定包含一切的容器,我简单的写:

vector v; 

在解释升压::任何(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中实现的operator =?

any & operator=(const any &); 

哪使得boost :: any能够容纳任何类型?运算符=定义于boost ::任何解释为:

影响:RHS复制内容到 当前实例,丢弃以前 内容,使新的内容 相当于两个类型和价值 的rhs的内容,如果是 rhs.empty()则为空。

抛出:std :: bad_alloc或任何 由包含类型的构造函数复制 引起的异常。 赋值满足强大的 保证异常安全。

http://www.boost.org/doc/libs/1_46_1/doc/html/boost/any.html

+1

嗯,我们并不需要* *它,但它总是不错的。 – ereOn 2011-05-24 07:02:04

回答

6

因为C++确实具有一般类型。它有类型模板,分别为每个替换类型编译。表达

vector v; 

是一个语法错误,因为载体不是类(这是一个类模板,可以通过给它的模板的参数来实例化类)。

在C++中有一个通用的类型,void*,但是你有责任记住你存储的内容(特别是为了删除目的)。该boost::any是一个类型安全的替代方案,记住你储存在那里是什么,如果你试图将其转换为一些它不能定义转换(你仍然有通过any_cast要问它的实际值)会给出一个错误。

至于operator=,是的,它是由容器使用。标准容器通常要求元素类型是默认的可构造和可赋值的,这意味着它们需要具有工作拷贝构造函数和赋值运算符。如果您使用某些操作,它们通常不必是默认可构造的,或者只需要默认构造。

+0

哦,是的,我的坏。向量v不是要声明的方法。我误以为它与Java。所以,要做类似的事情,我们使用矢量,但它有缺点,如你所说。为了使它像Java Collection一样,我们需要boost :: any,是吗? – Amumu 2011-05-24 07:08:40

+0

@Amumu:你说得对。 – ereOn 2011-05-24 07:10:52

+2

@Amumu:是的,没错。 Java具有通用的基类'java.lang.Object',它的泛型使用该基类的通用集合(它们纯粹是编译时,只是自动注入适当的强制类型)。相比之下,C++没有任何公共基类,很大程度上是因为公共基类只对引用语义有用,但C++默认值语义(有通用指针,void *,但大多数情况下不是C++中的指针)。 – 2011-05-24 07:21:46

1

为什么我们需要在脚本语言如PHP隐式类型是怎样的?

查看更多extreme example。如果有人这样做,显然他们需要它。

0

因为模板类型分辨率为编译时间和boost::any型 分辨率运行时。 boost::any是的,你 应该避免尽可能的事情之一,但在少数情况下,它的使用是合理的 ,你真的需要它—什么都没用。