簡體   English   中英

如何使用初始化列表在具有 constexpr char[] 的結構中初始化 char[]?

[英]How to initialize char[] in a struct with constexpr char[] using initializer list?

我有一個像這樣的結構:

constexpr char defaultName[6] = "Hello";

struct MyStruct{
   char name[6];
   int val;
};

現在我想使用初始化列表初始化結構,如下所示:

MyStruct structObj{defaultName, 0};

但是,這不起作用。 如何使用defaultName在初始化程序中初始化 char 數組?

我使用MyStruct structObj{defaultName, 0}; 但這不起作用。 我知道我可以做{"Hello", 0}但我想使用constexpr 此外, strcpy工作但只是想知道是否有一種方法可以在初始化列表中使用defaultName

注意:該結構在公共庫 C header 中定義,該庫由 C++ 代碼使用,因此我無法更新結構定義。

Arrays 通常不可復制,但std::array

constexpr std::array<char,6> defaultName {'H', 'e', 'l', 'l', 'o', '\0'};

struct MyStruct{
   std::array<char,6> name;
   int val;
};

MyStruct structObj{defaultName, 0};

如果您無法更新結構,請改用默認結構:

struct MyStruct{
   char name[6];
   int val;
};
constexpr MyStruct defaultStruct{"Hello",0};

MyStruct structObj(defaultStruct);

在 C++ 中,您可以創建一個助手 function 來初始化 C struct

在 C++17 中:

namespace detail {
template <std::size_t... Is>
constexpr MyStruct make_MyStruct_helper(std::index_sequence<Is...>,
                                        const char (&in)[sizeof...(Is)], int v) {
    return {{in[Is]...}, v};
}
}  // namespace detail

template <std::size_t N>
constexpr MyStruct make_MyStruct(const char (&in)[N], int v) {
    return detail::make_MyStruct_helper(std::make_index_sequence<N>(), in, v);
}

在 C++20 及更高版本中:

template <std::size_t N>
constexpr MyStruct make_MyStruct(const char (&in)[N], int v) {
    return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
        return MyStruct{{in[Is]...}, v};
    }(std::make_index_sequence<N>());
}

然后像這樣使用:

constexpr char defaultName[6] = "Hello";

int main() {
    constexpr auto structObj = make_MyStruct(defaultName, 0);
    constexpr auto another = make_MyStruct("foo", 1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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