如何在编译时创建带有 string_views 序列的 constexpr 数组?

2023-11-21

我想创建一个constexpr std::array<std::string_view, ConstexprNumber>。例如,它应该包含constexpr std::strings_view's像这样:

“文本0”,“文本1”,“文本2”,.....“文本”

我想出了以下初步解决方案:

#include <iostream>
#include <array>
#include <utility>
#include <string>
#include <string_view>

// Number of strings that we want to generate
constexpr size_t NumberOfTextsToGenerate = 10u;

// constexpr function to build a string
constexpr std::string_view makeString(unsigned int i) {
    return std::string_view("text");
}

// Helper: constexpr function that will create an array of string_views and initialize it
template <unsigned int... ManyIntegers>
constexpr auto generateTextHelper(std::integer_sequence<unsigned int, ManyIntegers...>) {
    return std::array<std::string_view, sizeof...(ManyIntegers)>{ {makeString(ManyIntegers)...}};
}

// Helper: constexpr function that will return an array of string_views as shown above with a specified number of texts
constexpr auto generateTextArray() {
    return generateTextHelper(std::make_integer_sequence<unsigned int, NumberOfTextsToGenerate>());
}

// This is a definition of a std::array<std::string_view,UpperBound> initialized with some text
constexpr auto text = generateTextArray();

int main() {
    for (size_t i{}; i < NumberOfTextsToGenerate; ++i)
        std::cout << text[i] << '\n';
    return 0;
}

但是,“makeString”函数当然不能满足我的要求。或者,更好地说,我不知道如何实施正确的解决方案。

我们怎样才能让这样的数组工作呢?基于这个初始解决方案还是类似的解决方案?


UPDATE: 另一种解决方案通过STL。

下面的解决方案是通过boost的预处理宏。


嗯,花了三个小时,但是我还是没能通过STL成功,所以我放弃了,最终我又回到了macro.

如果您不想导入整个boost图书馆,你可以把这些分开BOOST_PP宏到您的项目中,尽管它们仍然非常大,因此可能会花费您一些时间。

这是代码(链接到godbolt):

#include <iostream>
#include <string_view>
#include <experimental/array>

#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>


int main()
{
    constexpr auto strs_array = std::experimental::make_array<std::string_view>
    (
#define ADD_STRING(z, index, data)    BOOST_PP_COMMA_IF(index) data # index
        BOOST_PP_REPEAT(20, ADD_STRING, "test")
#undef ADD_STRING
    );

    for (const std::string_view &str : strs_array) {
        std::cout << str << '\n';
    }
}

允许生成的最大数量为BOOST_PP_LIMIT_REPEAT(当前为 256),这意味着您当前最多可以生成"test255",我想这已经足够了。

Output:

Program returned: 0
Program stdout
test0
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
test11
test12
test13
test14
test15
test16
test17
test18
test19
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在编译时创建带有 string_views 序列的 constexpr 数组? 的相关文章

随机推荐

  • 错误 SIPEPS,版本=5.0.0.0 UCMA 4.0 VS2010/VS2013

    我在 VS 2013 和 VS 2010 上开发了 UCMA 4 0 应用程序 运行项目时 出现以下错误 无法加载文件或程序集 SIPEPS Version 5 0 0 0 Culture neutral PublicKeyToken 31
  • 将小部件放置在 QScrollArea 的中心

    如何将固定大小的自定义小部件放置在 QScrollArea 的中心 我可以使用 myWidget pos x y 手动将小部件放置在 QScrollArea 内 但 QScrollArea 中没有 sizeChanged 信号 因此如果滚动
  • 使用 WebKit.NET 从 JavaScript 调用 C# 函数

    我一直在 c win forms 项目中使用 webkit net 并且喜欢使用以下命令从 C 程序中调用 JavaScript 函数是多么容易 browser Document InvokeScriptMethod functionNam
  • 如何通过删除不必要的字段来扩展评论框架(django)?

    我一直在阅读有关评论框架以及如何自定义它的 django 文档 http docs djangoproject com en 1 1 ref contrib comments custom 在该页面中 它显示了如何add表单中的新字段 但我
  • 使用 Python Spark Redshift

    我正在尝试将 Spark 与 amazon Redshift 连接 但收到此错误 我的代码如下 from pyspark sql import SQLContext from pyspark import SparkContext sc S
  • 在共享库中混合 PIC 和非 PIC 对象

    这个问题与this one以及它的答案 我刚刚发现我正在开发的构建中有一些丑陋之处 情况有点像下面这样 以 gmake 格式编写 请注意 这特别适用于 sparc 和 x86 硬件上的 32 位内存模型 OBJ SET1 some obje
  • Heroku 上的临时服务器的不同 robots.txt

    我在 Heroku 上有暂存和生产应用程序 对于爬虫 我设置了robots txt文件 之后我收到了谷歌的消息 尊敬的网站管理员 您网站的主机名 https www myapp com 与您的 SSL 证书中的任何 主题名称 都不匹配 这些
  • Rails 使用 Devise 向在线用户展示

    我想在 谁的在线 模块中向我的在线用户展示 我正在使用 Devise 来管理我的用户 我到处寻找 但我不知道如何管理它 你有线索吗 提前致谢 当有人登录时 你可以将他放入一个数组中 如果有人注销 只需将他从数组中删除即可 所以你可以循环数组
  • 为 Azure 数据库禁用查询编辑器中的设计

    当我尝试在 SQL Managements Studio 2012 中管理 Azure 数据库查询时 我发现 在查询编辑器中设计 选项被禁用 它适用于其他数据库 但不适用于 Azure 有办法启用它吗 Thanks 不幸的是 这是一个设计问
  • WPF 中的分页集合视图

    WPF 中是否有 PagedCollectionView 的实现 它存在于 Silverlight 中 但不存在于 WPF 中 如果没有 实现这一点的最简单方法是什么 您只需从以下位置获取代码即可银光一号并在您的 WPF 项目中使用它
  • 为什么 array_uintersect() 比较 array1 和 array2、array1 和 array1 以及 array2 和 array2 之间的元素?

    测试脚本 i 0 array uintersect foo bar baz qux function a b use i print r a b i 实际结果 Array 0 gt bar 1 gt foo 2 gt 0 Array 0 g
  • Azure 逻辑应用程序可以有多个启动触发器吗?

    Azure 逻辑应用程序可以有多个启动触发器吗 我已阅读触发器文档MSDN但看不到有多个触发器的任何内容 一般来说是的 您可以在逻辑应用工作流中拥有多个触发器 实际上 根据官方文档 您最多可以有 10 个 在单个逻辑应用程序中触发 例如 在
  • 如何从整数中删除第一个数字?

    我需要输入一个数字 例如 200939915 完成此操作后 我知道如何操作 我需要删除第一个数字 使其变为 00939915 做这个的最好方式是什么 char c 200939915 char d c 1
  • 使用 Auth0 登录成功,但仍然返回 401“访问被拒绝”?

    我设法让 Auth0 在我的 Vue js 应用程序中发挥作用 快速入门指南非常简单 因此 我成功地使用了登录功能 并收到了 Auth0 登录对话框的提示 我使用我的谷歌帐户进行快速登录 这也有效 我的 Google 帐户现在在我的 Aut
  • JavaScript 通过 className 获取子元素

    我在 Javascript 中编写了以下行 var eleCategory document getElementById cmbCategory 现在我想找到所有elementbyClassName包含在eleCategory元素 这样的
  • 嵌套 Async Await 不等待

    我想我误解了async await in c 我有两种返回一个的方法Task定义为 public async Task Name await AsyncOperation Imagine AsyncOperation 像一个PostAsyn
  • 如何在 Swift 中检查字符串是否包含中文?

    我想知道如何在Swift中检查字符串是否包含中文 比如我想检查里面是否有中文 var myString Hi 大家好 It s contains Chinese Thanks 这个答案 to 如何判断一个字符是否是汉字也可以很容易地翻译自
  • Google Maps Api V3 - 设置国家或城市样式

    我正在尝试制作一张地图 仅针对选定的区域 比如说国家 并去掉地图上的一些标签和内容 我找到了一个样式向导 http gmaps samples v3 googlecode com svn trunk styledmaps wizard in
  • 如何在 Notepad++ 中格式化 XML?

    I have 记事本 我得到了一些很长的 XML 代码 当我将其粘贴到 Notepad 中时 出现了一长行代码 难以阅读和使用 我想知道是否有一种简单的方法可以使文本可读 可读是指正确的选项卡代码 我可以手动完成 但我想要一个永久的解决方案
  • 如何在编译时创建带有 string_views 序列的 constexpr 数组?

    我想创建一个constexpr std array