我正在学习C ++模板,我发现像static_cast<>
,dynamic_cast<>
,const_cast<>
和reinterpret_cast<>
这样的类型转换看起来像模板,尽管书中说它们都是&#34;运算符&#34 ;.我想知道:
1)这些演员函数是否由模板编写?
2)如果是,我在哪里可以找到源代码?
3)如果不是这样,为什么它们都是以模板的形式设计的?是否可以通过模板实现它们?
答案 0 :(得分:4)
这些演员表功能是否由模板编写?
没有。正如你的书所说,他们是运营商。
为什么它们都是以模板的形式设计的?
与模板类似,它们的行为部分使用编译时类型参数指定。使用相同的语法在稍微不同的上下文中执行相同的操作是有意义的。
是否可以通过模板实现它们?
仅使用核心C ++语言,编号
static_cast
,const_cast
和reinterpret_cast
可以通过C风格演员(允许所有这些转换)和C +的组合来实现+11类型特征将转换限制为每种情况下允许的转换。然而,其中一些特征依赖于不能使用核心语言实现的魔法。
dynamic_cast
需要访问对象的RTTI信息;除了通过typeid
或dynamic_cast
之外,我们无法做到这一点。
答案 1 :(得分:3)
static_cast
等是语言关键字,因此不是模板。
他们看起来像模板模板,因为这是表达其功能的最佳功能形式。
在某种程度上,可以实现与这些强制转换相似的功能。例如,我在我的一些代码中定义了一个函数integral_cast
:
template<
typename T/*the desired type*/,
typename/*the source type*/ Y
> T integral_cast(const Y& y)
{
static_assert(false, "undefined integral_cast");
}
// Pass through for uint32_t
template<>
inline std::uint32_t integral_cast(const uint32_t& y)
{
return y;
}
/*and various other specialisations*/
这允许我在可能溢出目标类型的情况下从一种整数类型转换为另一种类型。调用语法与内置强制转换相同。