具有隐式数组大小的模板参数

2024-04-19

下面是一个简化的模板类,它接受数组作为模板参数。但是我还必须传递数组的大小作为参数。我想自动推导它并只写:

const char *TextArray[] = { "zero", "one", "two" };

Array<TextArray> a;

在实际实现中,类在编译时知道 TextArray 的大小,这是必需的(因为在编译时它会被检查并与类中的其他项配对)。如果我指定了错误的大小,我会正确地得到编译器错误:

Array<100, TextArray> a;

类定义:

#include <iostream>

template <std::size_t N, const char * (&A)[N]>
class Array
{
public:
    auto getCount()
    {
        return N;
    }
    auto getAt(std::size_t n)
    {
        return A[n];
    }
};


const char *TextArray[] = { "zero", "one", "two" };

int main() {
    Array<sizeof(TextArray)/sizeof(TextArray[0]), TextArray> a;

    printf("a.getCount() is %zu\n", a.getCount());
    printf("a.getAt(1) is %s\n", a.getAt(1));
}

Output:

a.getCount() 为 3

a.getAt(1) 是一

解决方案是使用宏,但我不想污染全局范围。一个简单的改进是更新类,以便我编写:

Array<sizeof(TextArray), TextArray> a;

在 gcc、Visual Studio、clang 上使用 C++17


您可以使用auto在模板参数中 https://stackoverflow.com/questions/38026884/advantages-of-auto-in-template-parameters-in-c17自 C++17 起,例如

template <auto &A>
class Array
{
public:
    auto getCount()
    {
        return std::size(A); // also C++17 feature, #include <iterator>
    }
    auto getAt(std::size_t n)
    {
        return A[n];
    }
};

顺便说一句,你最好明确地强制转换a.getCount() to unsigned来匹配%u说明符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有隐式数组大小的模板参数 的相关文章

  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • ASyncTasks 阻塞其他任务

    我有 2 个 ASyncTasks 一个从 httpPost 检索值 另一个更新 UI 的一些元素 包括列表视图 问题是 由于两个 ASyncTasks 共享相同的后台线程 如果网络操作首先启动并且运行缓慢 由于网络连接不良 其他后台线程花
  • 获取 IndexError:字符串索引超出范围

    我不知道为什么我会得到一个 IndexError 字符串索引超出范围 用这个代码 s oobbobobo a 0 for b in range len s 1 if s b b and s b 1 o and s b 2 s b a 1 e
  • iPhone 的文本转语音库 [重复]

    这个问题在这里已经有答案了 可能的重复 iPhone 上的文字转语音 https stackoverflow com questions 416064 text to speech on iphone 如何开始进行文本到语音转换iPhone
  • Ansible 手册:错误! “command”不是 Play 的有效属性[重复]

    这个问题在这里已经有答案了 我只是想写一个基本的剧本 并不断收到下面的错误 尝试了很多东西但仍然无法做到正确 我知道这一定是语法问题 但不知道在哪里 这是我的代码 This playbook runs a basic DF command
  • 使用PHP函数发送邮件时中继不允许的消息

    我正在使用 wamp 服务器并尝试使用 PHP 函数发送电子邮件mail email protected cdn cgi l email protection my subject my body 具有以下设置php ini SMTP IS
  • Cookie 是否可以保护令牌免受 XSS 攻击? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在为基于浏览器的 Javascript Web 应用程序构建基于 JWT JSON Web 令牌 的身份验证机制 使用无状态服务器
  • AngularJS 中 $routeChangeStart 的 Jasmine 单元测试用例

    嗨 我正在使用构建一个应用程序AngularJS现在我开始对我的应用程序进行单元测试 我知道如何为服务 控制器等编写单元测试用例 但我不知道如何编写它 routeChangeStart 我的 app js 中有以下代码 app run fu
  • 如何将单词和向量手动添加到Word2vec gensim?

    比方说 word2vec模型是我训练过的 word2vec 模型 当词汇表之外的单词 oov word 发生时 我计算一个向量vec using 计算向量 oov word 方法 现在 我想添加 追加oov word及其对应的向量vec到我
  • 当文件更改时,我可以让 docker-compose 重新启动容器吗?

    Docker compose 很好用docker composer up d将重新启动所有容器docker compose yml已经改变 但是 如果我更改了 它就不会拾取traefik toml我的容器之一需要在启动时读取 是否可以有do
  • Azure 上云服务的静态 IP [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个Cloud Service具有工人角色 云服务设置为可扩展到 5 个实例 有一项操作需要从 Azure 到我们的数据中心进行通信
  • 在字符数组中包含 char 的十进制等效项

    如何使用字符的十进制 十六进制表示形式而不是实际字符创建字符数组 我问的原因是因为我正在编写 C 代码 并且我需要创建一个包含英语中未使用的字符的字符串 然后该字符串将被解析并显示到 LCD 屏幕上 例如 0 解码为 0 n 解码为 10
  • 在 bootstrap 模式中使用 ajax 加载内容

    我正在尝试使用 ajax 让我的引导模式检索数据 a href img src alt Birthdays height 120 width 109 a 我的模式 div class modal hide div
  • 何时使用 ErrorException 与 Exception?

    PHP 5 1引入了错误异常 http php net manual en class errorexception php 两个函数的构造函数不同 public construct string message int code 0 Ex
  • node-gyp 配置得到“gyp ERR!找到 VS”

    我正在尝试开始有关节点 c c 附加组件 这node gyp命令出错 我已经安装了vs2019 我的命令是 node gyp configure msvs version 2019 详细输出是 gyp info it worked if i
  • @Override 注解的问题

    我正在制作一个类似于 Banko 小程序的 Java 应用程序 当我点击 public void init 方法时 我进展顺利 当我完成后 除此之外的所有内容都已编译完毕 它告诉我添加 Override 注释 我尝试过 但每当我这样做时 无
  • 如何在 Android 中创建 https 连接?

    我在 Stackoverflow 中找到了很多帖子 但无法找到适用的解决方案 如何在 Android 中创建 https 连接 代码是 HttpParams httpParameters new BasicHttpParams ConnMa
  • ComponentDidUpdate 使用情况和最大更新深度超出

    我有一个设置屏幕 我可以从用户那里获取一些信息 例如年龄 体重和性别 在获得这些信息后 我计算用户每天应该喝多少水 我想自动计算这个金额 而不需要任何计算按钮 不变违规 超出最大更新深度 当组件在 componentWillUpdate 或
  • 无法使用我的机器的 IP 地址运行我的 Node.Js 应用程序,但可以使用 localhost

    所以我设置了一个 Node js 应用程序来侦听我机器的端口 5050 所以当我去http localhost 5050 myapp http localhost 5050 myapp我的应用程序加载良好 我使用的是express框架 因此
  • rel-canonical 还应该包括协议 (http/https) 吗?

    我正在将我的网站从 http 迁移到 https 尽管它仍然支持通过 http 访问 目前我的所有页面都在 HTML 中设置了准确的 rel canonical 元标记 但显然它们都指向规范的 http url 我现在是否也应该将它们更新为
  • 具有隐式数组大小的模板参数

    下面是一个简化的模板类 它接受数组作为模板参数 但是我还必须传递数组的大小作为参数 我想自动推导它并只写 const char TextArray zero one two Array