![](/img/trans.png)
[英]C++ Initializing array member with a length known by constructor at compile time
[英]How define array of blanks of C++ compile time defined length?
我想定義一個與空白const int或宏完全一樣長的ASCII空白字符串(字符數組)。 我希望它發生在編譯時,而不是運行時。
例如,如果
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長的char數組,其中numBlanks
是C ++靜態const int還是宏?
這是一種使用可變參數模板和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";
}
我通過一些試驗弄清楚了,您可以使用功能更強大的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());
}
謝謝大家 我投票並標記了您的一些答復為答案。
我想我希望有一些簡單的東西。 這不是世界上最重要的編程要求。 我只是以為也許我錯過了一種簡單的方法。 您的回答很棒!
我認為最簡單的方法就是扭轉問題:讓編碼人員指定所需長度的字符串,然后從中得出長度:
// 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.