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

时间:2011-05-24 06:59:16

标签: c++ boost type-conversion

为什么我们需要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);
}

可以接受吗?容器是否使用operator ::在boost :: any?

中实现
any & operator=(const any &);

这使得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

3 个答案:

答案 0 :(得分:6)

因为C ++ 具有泛型类型。它有类型模板,它们分别为每个替换类型编译。表达式

vector v;

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

C ++中有一种通用类型,void*,但是你有责任记住你存储在其中的内容(特别是为了删除)。 boost::any是一种类型安全的替代方案,可以记住您在那里存储的内容,并且如果您尝试将其转换为未定义转换的内容,则会给出错误(您仍需要通过{{向它询问实际值) 1}})。

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

答案 1 :(得分:1)

  

为什么我们需要类似PHP等脚本语言的隐式类型?

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

答案 2 :(得分:0)

因为模板类型解析是编译时间,并且boost::any类型 分辨率是运行时。 boost::any是你的其中一件事 应该尽可能避免,但在少数使用它的情况下 有道理,你真的需要它 - 别的什么都不会。