【问题标题】:c++11 template type aliases to reduce painc++11模板类型别名以减轻痛苦
【发布时间】:2015-01-20 09:18:36
【问题描述】:

C++11 是否提供了缩短千行长模板类名称(std:: 以及我自己的类型)的方法?

这将减少解密和打印漂亮消息的痛苦。我想定义自定义别名,将扩展的模板类型名称替换为唯一且定义明确的替代名称。

使用typedefusing 无济于事,因为编译器和gdb 仍将打印完整的类型名称。 stl 以及自定义模板类型应该可以使用别名。理想情况下,gccclanggdb 应该使用自定义名称。

【问题讨论】:

    标签: c++ templates c++11 gcc clang


    【解决方案1】:

    不,语言本身无法更改工具显示名称的方式,这超出了标准的范围,并且不同工具处理的方式不一致。

    GCC 有一个-fno-pretty-templates 选项,用于调整模板特化在诊断中的显示方式。

    您可以在 Python 中定义 Type Printers 来告诉 GDB 如何打印您的类型。我为 libstdc++ 编写了一些代码,以便 GDB 将打印 std::vector<X> 而不是 std::vector<X, std::allocator<X> >。它不影响编译器诊断中显示的类型,仅在 GDB 中。

    【讨论】:

      【解决方案2】:

      在某些情况下,我通过将usingtypedef 替换为继承来减轻痛苦;例如而不是using MyType = MyTemplate<MyTraits<Blah>>

      struct MyType : MyTemplate<MyTraits<Blah>>
      {
        // possibly some stuff
      };
      

      在后一种情况下,MyType 的使用只是这样,其中作为类型别名(usingtypedef),编译器和调试器将打印出有时信息量较少的长复杂类型,而在后一种情况它只会打印MyTypepossibly some stuff 是美中不足的地方,因为现在引入了继承。

      【讨论】:

      • 这不会导致编译器警告有关虚拟析构函数吗?
      • @mic_e,仅当您使用-Wnon-virtual-dtor 或存在严重缺陷的-Weffc++ 选项时。不要那样做。 -Wdelete-non-virtual-dtor 几乎在所有方面都更好,并且由 -Wall 启用
      • 我主要在泛型编程中使用它,这些复杂的签名大量出现。在这些情况下没有虚函数。
      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2016-06-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多