在可变参数模板函数中推导数组大小
Deduce the array-sizes in a variadic template function
我尝试编写一个 constexpr
函数来接受可变数量的 C 字符串。我想推断出传递的数组的所有大小(此处:L0
和 LL
)。看起来我在那里犯了一个愚蠢的错误,但尝试这样做时,我得到了一个错误:
error: parameter packs not expanded with '...':
204 | constexpr auto generate(const char (&s0)[L0], const char (&ss)[LL] ...) {
template<size_t L0, size_t... LL>
constexpr auto generate(const char (&s0)[L0], const char (&ss)[LL] ...) {
constexpr size_t ll = (LL + ...);
std::integral_constant<size_t, L0>::_;
std::integral_constant<size_t, ll>::_;
std::array<char, 1 + L0 + ll> r;
return r;
}
constexpr auto STR_X = generate("abc", "def");
这是通过 gcc
版本 12.0 和 -std=c++20
完成的。
问题应该是 ss
的扩展(这也是可变的)
// ellipsis here ...........................................VVV
constexpr auto generate(const char (&s0)[L0], const char (& ... ss)[LL]) {
问题是您在错误的地方使用了省略号 ...
。更正如下图:
template<size_t L0, size_t... LL>
constexpr auto generate(const char (&s0)[L0], const char (&...ss)[LL]) {
//^^^
}
您可以通过避免过度指定参数类型来简化函数。此外,由于第一个参数与其余参数没有区别对待,因此似乎没有必要:
constexpr auto
generate(auto&&... ss) {
constexpr size_t ll = (sizeof(ss) + ...);
return std::array<char, 1 + ll>{};
}
我尝试编写一个 constexpr
函数来接受可变数量的 C 字符串。我想推断出传递的数组的所有大小(此处:L0
和 LL
)。看起来我在那里犯了一个愚蠢的错误,但尝试这样做时,我得到了一个错误:
error: parameter packs not expanded with '...':
204 | constexpr auto generate(const char (&s0)[L0], const char (&ss)[LL] ...) {
template<size_t L0, size_t... LL>
constexpr auto generate(const char (&s0)[L0], const char (&ss)[LL] ...) {
constexpr size_t ll = (LL + ...);
std::integral_constant<size_t, L0>::_;
std::integral_constant<size_t, ll>::_;
std::array<char, 1 + L0 + ll> r;
return r;
}
constexpr auto STR_X = generate("abc", "def");
这是通过 gcc
版本 12.0 和 -std=c++20
完成的。
问题应该是 ss
的扩展(这也是可变的)
// ellipsis here ...........................................VVV
constexpr auto generate(const char (&s0)[L0], const char (& ... ss)[LL]) {
问题是您在错误的地方使用了省略号 ...
。更正如下图:
template<size_t L0, size_t... LL>
constexpr auto generate(const char (&s0)[L0], const char (&...ss)[LL]) {
//^^^
}
您可以通过避免过度指定参数类型来简化函数。此外,由于第一个参数与其余参数没有区别对待,因此似乎没有必要:
constexpr auto
generate(auto&&... ss) {
constexpr size_t ll = (sizeof(ss) + ...);
return std::array<char, 1 + ll>{};
}