首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何定义C++编译时定义长度的空格数组?

如何定义C++编译时定义长度的空格数组?
EN

Stack Overflow用户
提问于 2017-03-02 08:36:32
回答 3查看 243关注 0票数 1

我想定义一个ASCII空格的字符串(char数组),和一些静态常量、int或宏一样长。我希望它发生在编译时,而不是运行时。

例如,如果

代码语言:javascript
运行
复制
static const int numBlanks = 5

然后

代码语言:javascript
运行
复制
char foo[] = "     " 

(五个空格)

如果

代码语言:javascript
运行
复制
numBlanks = 3 

然后

代码语言:javascript
运行
复制
char foo[] = "   " 

(三个空格)

以此类推。(为什么?我想将它与strstr()一起使用来定位至少包含numBlanks的序列,并在编译时设置numBlanks。)

是的,你可以用newmemset()/0来做,但是我想在编译时做一次,而不是在运行时一次又一次。

是的,我可以非常接近

代码语言:javascript
运行
复制
char foo[] = "                        "; 
foo[numBlanks] = '\0'; 

以及一个注释或assert(),以确保numBlanks永远不会大于foo的编译长度。

但我可以在编译时完成所有这些操作吗?定义一个包含所有空格的字符数组,其中numBlanks是一个C++静态常量整数还是一个宏?

EN

Stack Overflow用户

回答已采纳

发布于 2017-03-02 09:40:48

通过一些实验,我发现可以使用更强大的constexpr语句在c++14或更高版本中实现这一点。在这种情况下,使用递归模板。

代码语言:javascript
运行
复制
#include <cstdio>
#include <array>

template<size_t arrsize, size_t setnum>
constexpr void initVal(std::array<char, arrsize> &tmp) {
   std::get<setnum>(tmp) = ' ';
   if (setnum) initVal<arrsize, setnum ? setnum - 1 : 0>(tmp);
}

template<size_t arrsize>
constexpr auto initArray() -> std::array<char, arrsize> {
   std::array<char, arrsize> tmp{};
   std::get<arrsize - 1>(tmp) = '\0';
   initVal<arrsize, arrsize - 2>(tmp);
   return tmp;
}

constexpr std::array<char, 5 + 1> globalArr = initArray<5 + 1>();

int main()
{
   puts(globalArr.data());
}
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42544812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档