如何将函数的可变参数打包到数组中并从该函数返回它?所有参数都是同一类型。
这是我尝试做的,但它似乎只设置数组的第一个元素,其余元素为零。所以这样不好。
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
我的代码有什么问题?
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)...};
}