首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 3

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

Stack Overflow用户

发布于 2017-03-02 08:58:57

这里有一种使用可变模板和std::make_index_sequence的方法

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

template<typename T> struct blank_array;
template<std::size_t... Is>
struct blank_array<std::integer_sequence<std::size_t, Is...>> {
    static constexpr char arr[] = {(Is, ' ')..., '\0'};
};
template<std::size_t... Is>
constexpr char blank_array<std::integer_sequence<std::size_t, Is...>>::arr[];

template<std::size_t N>
constexpr const char (&blanks)[N+1] =
    blank_array<std::make_index_sequence<N>>::arr;

示例用法:

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

int main()
{
    std::cout << "[" << blanks<5> << "]\n";
}
票数 1
EN

Stack Overflow用户

发布于 2017-03-02 22:53:26

谢谢大家。我对你的几个回复投了赞成票并将其标记为答案。

我想我希望的是更简单的东西。这并不是世界上最重要的编程要求;我只是想,也许我错过了一种简单的方式来实现这一点。你的答案很棒!

我决定最简单的事情是颠倒这个问题:让编码器指定一个所需长度的字符串,并从中推导出长度:

代码语言:javascript
运行
复制
// Fill the following blanks array to a length equal to the minimum number of blanks to find (minimum 2)
//                            12345678901234567890
static const char blanks[] = "     ";
static const int numBlanks = sizeof(blanks)-1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42544812

复制
相关文章

相似问题

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