(Boost)为什么我们需要一个泛型类型
(Boost) Why do we need a generic type?
为什么我们需要在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等脚本语言中需要隐式类型?
更进一步,在助推::任何例子,为什么:
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中实现的运算符=?
any & operator=(const any &);
这使得boost::任何人都能持有任何类型的?运算符=在boost::any中定义为:
效果:将rhs的内容复制到当前实例,放弃上一个内容,以便新内容在类型和值上都等效于rhs的内容,如果rhs.empty().
投掷:std::bad_alloc或任意副本引起的例外情况包含类型的构造函数。任务满足强者确保异常安全。
http://www.boost.org/doc/libs/1_46_1/doc/html/boost/any.html
因为C++不具有泛型类型。它有类型模板,这些模板是为每个被替换的类型单独编译的。表达式
vector v;
是一个语法错误,因为vector不是一个类(它是一个类模板,可以通过给它提供模板参数来实例化为类)。
C++中有一个有点通用的类型,void*
,但你有责任记住你在其中存储的内容(特别是为了删除)。boost::any
是一个类型安全的替代方案,它会记住您在那里存储的内容,如果您试图将其转换为它没有定义转换的内容,则会出现错误(您仍然需要通过any_cast
向它询问实际值)。
对于operator=
,是的,它被容器使用。标准容器通常要求元素类型是默认的可构造和可赋值的,这意味着它们需要有工作副本构造函数和赋值运算符。它们通常不必是默认可构造的,或者只有在使用某些操作时才必须是默认可构建的。
为什么我们在PHP等脚本语言中需要隐式类型?
请看一个更极端的例子。如果有人这样做,显然他们需要它。
因为模板类型解析为编译时,而boost::any
类型解决方案是运行时。boost::any
就是你应尽可能避免,但在少数情况下使用有道理,你真的需要它—其他什么都做不了。
- 使用泛型类型推送到堆栈时出现问题
- 如何在容器中指定模板化别名的泛型类型
- 具有模板专用化的泛型类型转换
- C++存储泛型 T 类型类的向量
- 如何在C++中返回没有模板的泛型类型?
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 泛型类型别名,它们彼此不兼容
- 泛型类型转换
- 重载泛型类型的模板类时检查运算符=时的自赋值
- 在C++中,如何根据类中的参数返回不同的泛型类型
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- 使用泛型类型显式实例化函数模板
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- 如何编写一个可以以类型安全的方式迭代泛型类型的函数
- 如何编写一个可以迭代泛型类型的函数
- 使用C++生成泛型类型-一个具有共享实现的模板
- 提取C++中另一个泛型类型的泛型类型
- (Boost)为什么我们需要一个泛型类型