跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

  1. 主页
  2. SubForums
  3. 现代C++ | mcpp论坛
  4. C++中的initializer_list获取列表长度并用于模板参数的编译期计算小示例

C++中的initializer_list获取列表长度并用于模板参数的编译期计算小示例

已定时 已固定 已锁定 已移动 现代C++ | mcpp论坛
cpp11编译期计算代码示例
8 帖子 4 发布者 102 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • SPeakS 离线
    SPeakS 离线
    SPeak d2learn-dev
    写于 最后由 SPeak 编辑
    #1

    用 std::array的initializer_list + 一键计算字节的模板来演示用于模板参数的可能

    #include <iostream>
    #include <array>
    
    template <typename T, int SZ>
    struct Byte {
         static constexpr int size = sizeof(T) * SZ;
    };
    
    int main() {
        constexpr std::array<int, 4> arr {1, 2, 3, 4};
        std::cout << Byte<int, arr.size()>::size << std::endl;
        return 0;
    }
    

    50a93cd6-0573-478a-80c4-8de12bd9868a-image.png


    想法来自该视频评论区的讨论: https://www.bilibili.com/video/BV1vKuQzkEo2

    1 条回复 最后回复
    0
    • sunrisepeakS sunrisepeak 从 中的 General Discussion | 综合讨论 移动了该主题
    • 月 离线
      月 离线
      月仁不吃五饼
      编写于 最后由 编辑
      #2

      这个在C++17后的版本是可以通过的,但是C++14以前应该是没法编译通过的吧,对于兼容性来讲还是有一些欠缺

      sunrisepeakS 1 条回复 最后回复
      0
      • 月 离线
        月 离线
        月仁不吃五饼
        编写于 最后由 编辑
        #3

        我觉得应该写template<typename T,size_t t>好一点,如果这个数组非常大,那被转换到int有符号数可能溢出

        sunrisepeakS 1 条回复 最后回复
        1
        • sunrisepeakS 在线
          sunrisepeakS 在线
          sunrisepeak d2learn-dev
          回复了月仁不吃五饼 最后由 编辑
          #4

          @月仁不吃五饼

          gcc 用14 应该可以编译通过
          8e251f36-ef98-4e25-972e-574789134dec-image.png

          clang的话目前还没试过

          1 条回复 最后回复
          0
          • sunrisepeakS 在线
            sunrisepeakS 在线
            sunrisepeak d2learn-dev
            回复了月仁不吃五饼 最后由 编辑
            #5

            @月仁不吃五饼 在 C++中的initializer_list获取列表长度并用于模板参数的编译期计算小示例 中说:

            我觉得应该写template<typename T,size_t t>好一点,如果这个数组非常大,那被转换到int有符号数可能溢出

            这里用size_t 更规范一点, 在意图上长度也是>=0. 当时就为了简单能表达就用了int

            1 条回复 最后回复
            0
            • sunrisepeakS 在线
              sunrisepeakS 在线
              sunrisepeak d2learn-dev
              编写于 最后由 编辑
              #6

              看错误了 补 gcc 11

              image.png

              1 条回复 最后回复
              0
              • FrozenLemonTeeF 离线
                FrozenLemonTeeF 离线
                FrozenLemonTee
                编写于 最后由 编辑
                #7

                clang最小可编译的版本和标准是clang3.4.1+cpp11:

                image.png

                月 1 条回复 最后回复
                1
                • 月 离线
                  月 离线
                  月仁不吃五饼
                  回复了FrozenLemonTee 最后由 编辑
                  #8

                  @FrozenLemonTee 在 C++中的initializer_list获取列表长度并用于模板参数的编译期计算小示例 中说:

                  clang最小可编译的版本和标准是clang3.4.1+cpp11:

                  image.png

                  这样

                  1 条回复 最后回复
                  0

                  • 登录

                  • 没有帐号? 注册

                  • 登录或注册以进行搜索。
                  d2learn forums Powered by NodeBB
                  • 第一个帖子
                    最后一个帖子
                  0
                  • 版块
                  • 最新
                  • 标签
                  • 热门
                  • Online Tools
                  • 用户
                  • 群组