代码之家  ›  专栏  ›  技术社区  ›  Suhrob Samiev

有可能缩短这份声明吗?

  •  1
  • Suhrob Samiev  · 技术社区  · 12 年前

    有没有可能缩短这个声明,因为我在代码中经常使用它

    例如,我用这个来铸造 Object 到我的 CustomObject 使用

    dynamic_cast/static_cast<TCustomClassName*>(SenderObject)
    

    有没有可能缩短使用时间 typedef static_cast<TCustomClassName*> 或者类似的东西,确保在中使用cast运算符是可能的 typedef ?

    4 回复  |  直到 12 年前
        1
  •  10
  •   Community c0D3l0g1c    7 年前

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

        2
  •  1
  •   Remy Lebeau    12 年前

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

    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); 
    
        3
  •  0
  •   Andreas Fester    12 年前

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

        4
  •  0
  •   rooltex    4 年前

    可以通过这种方式:

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

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