首页 文章

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

提问于
浏览
1

为什么我们需要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 回答

  • 6

    因为模板类型解析是编译时,而 boost::any 类型解析是运行时 . boost::any 是你应该尽可能避免的事情之一,但在少数情况下,它的使用是合理的,你真的需要它 - 没有别的办法 .

  • 1

    因为C确实 not 具有泛型类型 . 它有类型模板,分别为每个替换类型编译 . 表达方式

    vector v;
    

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

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

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

  • 0

    为什么我们需要像PHP这样的脚本语言中的隐式类型?

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

相关问题