是否可以缩短此声明?

时间:2012-09-19 06:39:50

标签: c++ c++builder c++builder-2010

是否有可能缩短此声明,因为我经常在我的代码中使用它

例如,我使用此功能使用

Object投射到我的CustomObject
dynamic_cast/static_cast<TCustomClassName*>(SenderObject)

是否有可能使用typedef static_cast<TCustomClassName*>或类似的东西来缩短它,以确保在typedef中使用强制转换运算符是可能的?

4 个答案:

答案 0 :(得分:10)

不,你不能,而你不应该!不要为强制转换操作符定义任何宏,它会使应用程序代码的维护者感到困惑,并会对编程圈造成严重破坏。这些运算符完全有理由提供一种可读的方式来告诉程序员,这里正在发生演员表。无论日常使用的强制转换都会导致程序员之间产生混淆,因此这些关键字可以帮助他们。因此,坚持使用它们并明智地使用它们。不要回复到C风格的转换,这些运算符的目的是提供一种方法来理解代码中发生的事情。如果您不熟悉它们,请阅读:When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

答案 1 :(得分:1)

您可以使用模板化函数代替宏,这样您就不会失去任何类型的安全性:

template<typename InputType, typename ReturnType>
void SCast(InputType Input, ReturnType &Ret)
{
    Ret = static_cast<ReturnType>(Input);
}

template<typename InputType, typename ReturnType>
void DCast(InputType Input, ReturnType &Ret)
{
    Ret = dynamic_cast<ReturnType>(Input);
}

template<typename InputType, typename ReturnType>
void RCast(InputType Input, ReturnType &Ret)
{
    Ret = reinterpret_cast<ReturnType>(Input);
}

然后你可以像这样使用它们:

TCustomClassName *cls;
SCast(SenderObject, cls); 

TCustomClassName *cls;
DCast(SenderObject, cls); 

TCustomClassName *cls;
RCast(SenderObject, cls); 

答案 2 :(得分:0)

使用IDE的键盘快捷键。例如,在Eclipse中,通过代码完成,只需要几次击键就可以输入static_cast<MyClass*>.如果您经常需要相同的键盘,您甚至可以定义自己的键盘宏来通过一个热键插入样板。

答案 3 :(得分:0)

这是可能的:

auto ToUi16 = [](auto v)
{
    return static_cast<unsigned __int16>(v);
};

但这会使您的代码可读性降低。