我想定义一个ASCII空格的字符串(char数组),和一些静态常量、int或宏一样长。我希望它发生在编译时,而不是运行时。
例如,如果
static const int numBlanks = 5然后
char foo[] = " " (五个空格)
如果
numBlanks = 3 然后
char foo[] = " " (三个空格)
以此类推。(为什么?我想将它与strstr()一起使用来定位至少包含numBlanks的序列,并在编译时设置numBlanks。)
是的,你可以用new,memset()和/0来做,但是我想在编译时做一次,而不是在运行时一次又一次。
是的,我可以非常接近
char foo[] = " ";
foo[numBlanks] = '\0'; 以及一个注释或assert(),以确保numBlanks永远不会大于foo的编译长度。
但我可以在编译时完成所有这些操作吗?定义一个包含所有空格的字符数组,其中numBlanks是一个C++静态常量整数还是一个宏?
发布于 2017-03-02 09:40:48
通过一些实验,我发现可以使用更强大的constexpr语句在c++14或更高版本中实现这一点。在这种情况下,使用递归模板。
#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());
}https://stackoverflow.com/questions/42544812
复制相似问题