1

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

例如,我用它来Object转换为我的CustomObjectusing

dynamic_cast/static_cast<TCustomClassName*>(SenderObject)

有没有可能缩短这个 usingtypedef static_cast<TCustomClassName*>或类似的东西以确保可以使用 cast 运算符 in typedef

4

4 回答 4

10

不,你不能,你不应该!不要为强制转换运算符定义任何宏,它会混淆您的应用程序代码的维护者,并会在您的编程圈子中造成严重破坏。这些运算符的存在正是为了提供一种可读的方式来告诉程序员,这里正在发生强制转换。日常使用的强制转换会引起程序员之间的混淆,因此这些关键字可以帮助他们。因此,坚持使用它们并明智地使用它们。甚至不要恢复到 C 风格的转换,这些运算符的目的是提供一种理解代码中发生的事情的方法。如果您不熟悉它们,请阅读以下内容:何时应使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

于 2012-09-19T07:01:45.720 回答
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); 
于 2012-09-19T21:50:14.593 回答
0

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

于 2012-09-19T07:10:03.883 回答
0

可以通过这种方式:

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

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

于 2020-11-24T09:26:02.730 回答