【问题标题】:typedef template, is this one possible?typedef 模板,这可能吗?
【发布时间】:2016-04-14 14:02:06
【问题描述】:

是否可以这样做:

template< typename T >
using T_CCUnit = static const constexpr T;

事实上,我只是想要static const constexpr 的别名,因为每次都写在某个文件中真的很无聊。 我更喜欢 c++11 中的解决方案。

【问题讨论】:

    标签: c++ templates c++11 typedef


    【解决方案1】:

    你可以很容易地为类型添加 const-ness,因为 cv-qualifiers 修改了类型:

    template <typename T>
    using T_C = std::add_const_t<T>;
    

    但是,staticconstexpr 修改的是声明,而不是类型。所以,这里:

                             int x1;
                       const int x2;
      static           const int x3;
      static constexpr const int x4;
    //      |    ^    |  type   |name
    //   ^  | constexpr specifier
    // storage class specifier
    

    最后三个声明都是const int类型,但x2x3x4有不同的存储类。

    老实说,如果主要问题是那个

    ...写起来真的很无聊...

    我最好的建议是你学习如何在你喜欢的编辑器中编写宏或保存常用代码 sn-ps。

    【讨论】:

    • 我会像 teivaz 所说的那样继续关注宏。感谢您的详细信息! Snippets 不会这样做,因为我做了很多标志声明,所有这些关键字都会弄得一团糟。
    【解决方案2】:

    我认为对您来说最好的解决方案是为此使用宏。

    #define STATIC_CONST_CONSTEXPR static const constexpr

    但说真的,staticconstexpr 不是该类型的修饰符。在您的情况下,您可以使用using 做的所有事情都是const T。您自己编写或要求预处理器为您编写的其他所有内容。

    【讨论】:

    • 是的,你是对的。我非常专注于找到一种“c++”方法,以至于忘记了最简单的方法:宏。如果有人有其他想法,我会稍等。
    【解决方案3】:

    static 存储限定符适用于实例,而不适用于类型。所以不可能typedef它。

    【讨论】:

      【解决方案4】:

      您不能 typedef staticconstexpr - 两者都不是类型的一部分。也就是说,即使你可以,也没有人会知道:

      T_CCUnit<int> x = 4;
      

      意思是,但每个人都知道是什么:

      static constexpr int x = 4;
      

      的意思。值得每次输入额外的 7 个字符以使您的代码更清晰。你代码的所有读者,以及你未来的自己,都会感谢你。


      旁注,constconstexpr 是多余的 - 每个声明为 constexpr 的变量都隐含地为 const

      【讨论】:

      • 我知道我谈到了 c++11,但 constexpr 在 c++14 中不再是 const。所以如果我可以继续使用 c++14,我会有一些问题。
      • @MathieuVanNevel "对象声明中使用的 constexpr 说明符将对象声明为 const。" [dcl.constexpr]
      • 哦,看来您对静态成员是正确的,该子句仅涉及非静态成员。有点奇怪,为什么不呢,我试试,谢谢。
      • @MathieuVanNevel 我引用的这句话是关于对象的,而不是关于成员的。非静态数据成员不能是constexpr
      • 对不起,我在评论中漏掉了一个词,该子句是关于功能的。我需要检查更多关于 c++14...
      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多