为什么我们需要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
答案 0 :(得分:6)
因为C ++ 不具有泛型类型。它有类型模板,它们分别为每个替换类型编译。表达式
vector v;
是一个语法错误,因为vector不是一个类(它是一个可以通过给它模板参数实例化为类的类模板)。
C ++中有一种通用类型,void*
,但是你有责任记住你存储在其中的内容(特别是为了删除)。 boost::any
是一种类型安全的替代方案,可以记住您在那里存储的内容,并且如果您尝试将其转换为未定义转换的内容,则会给出错误(您仍需要通过{{向它询问实际值) 1}})。
至于any_cast
,是的,容器使用它。标准容器通常要求元素类型是默认可构造和可分配的,这意味着它们需要具有工作副本构造函数和赋值运算符。它们通常不必是默认构造,或者只有在使用某些操作时才必须是默认构造。
答案 1 :(得分:1)
为什么我们需要类似PHP等脚本语言的隐式类型?
查看更多extreme example。如果有人这样做,显然他们需要它。
答案 2 :(得分:0)
因为模板类型解析是编译时间,并且boost::any
类型
分辨率是运行时。 boost::any
是你的其中一件事
应该尽可能避免,但在少数使用它的情况下
有道理,你真的需要它 - 别的什么都不会。