如何将模板函数的可变参数打包到数组中?

问题描述 投票:0回答:1

如何将函数的可变参数打包到数组中并从该函数返回它?所有参数都是同一类型。

这是我尝试做的,但它似乎只设置数组的第一个元素,其余元素为零。所以这样不好。

template<typename... T>
inline auto CreateArray(const T... t)
{
    constexpr int ELEMENT_COUNT = TotalElementCount(t...);

    return std::array<int, ELEMENT_COUNT>{ (t, ...) };
}

所以如果我运行以下代码:

    auto new_array = CreateArray(1, 2, 3, 4);

    for (auto x : new_array)
        std::cout << std::dec << x << std::endl;

我会得到结果:

4
0
0
0

我的代码有什么问题?

c++ templates variadic-functions
1个回答
1
投票
  • TotalElementCount(t...);
    应该只是
    sizeof...(t)
  • (t, ...)
    是逗号运算符的折叠。逗号运算符丢弃左侧操作数的结果,仅保留最右侧的操作数。与之比较:
    std::cout << (1,2,3,4) << '\n'; // prints 4
    

这里你想要的不是折叠表达式而是包展开:

template <typename... T>
inline auto CreateArray(const T... t) {
    constexpr int ELEMENT_COUNT = sizeof...(t);

    return std::array<int, ELEMENT_COUNT>{t...};
//                                       ^^^^^^
}

完美转发版本:

template <typename... T>
inline auto CreateArray(T&&... t) {
    constexpr int ELEMENT_COUNT = sizeof...(t);

    return std::array<int, ELEMENT_COUNT>{std::forward<T>(t)...};
}
© www.soinside.com 2019 - 2024. All rights reserved.