簡體   English   中英

如何定義C ++的空白數組編譯時定義的長度?

[英]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 。)

是的,您可以使用newmemset()/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM