在可变参数模板函数中推导数组大小

Deduce the array-sizes in a variadic template function

我尝试编写一个 constexpr 函数来接受可变数量的 C 字符串。我想推断出传递的数组的所有大小(此处:L0LL)。看起来我在那里犯了一个愚蠢的错误,但尝试这样做时,我得到了一个错误:

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>{};
}