我想定义一个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());
}发布于 2017-03-02 08:58:57
这里有一种使用可变模板和std::make_index_sequence的方法
#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;示例用法:
#include <iostream>
int main()
{
std::cout << "[" << blanks<5> << "]\n";
}发布于 2017-03-02 22:53:26
谢谢大家。我对你的几个回复投了赞成票并将其标记为答案。
我想我希望的是更简单的东西。这并不是世界上最重要的编程要求;我只是想,也许我错过了一种简单的方式来实现这一点。你的答案很棒!
我决定最简单的事情是颠倒这个问题:让编码器指定一个所需长度的字符串,并从中推导出长度:
// 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;https://stackoverflow.com/questions/42544812
复制相似问题