如何将可变函数参数转换为数组?

How to convert variadic function arguments to array?

如何将可变函数参数转换为数组? 我需要这样的东西:

template <typename T>
struct Colordata
{
public:
    T dataFirst;
    T dataLast;

    template <typename... Ta>
    Colordata(Ta... args)
    {
        constexpr std::size_t n = sizeof...(Ta);
        std::cout << n << std::endl;
        dataFirst = (args..)[0];
        dataLast = (args...)[n - 1];
        return;
    }   
};

int main(int argc, char const *argv[])
{
    auto a = Colordata<float>(1.0f, 2.2f, 3.3f, 4.3f, 5.5f);
    return 0;
}

我尝试将可变参数用作 T args, ... 并使用 stdarg.h 中的函数,但我无法获得参数的计数。

您不能将参数包转换为数组。您可以从一个数组创建一个数组,但那样会复制,那会很浪费。相反,我们可以将参数包“转换”为 tuple of references, and then use get 以索引到该元组中。看起来像

template <typename... Ta>
Colordata(Ta... args)
{
    constexpr std::size_t n = sizeof...(Ta);
    static_assert(n >= 1, "must pass at least one argument");
    std::cout << n << std::endl;
    auto& tuple = std::tie(args...);
    dataFirst = std::get<0>(tuple)
    dataLast = std::get<n - 1>(tuple);
}  

从对构造函数参数的处理来看,似乎不需要数组,也不需要以任何方式存储参数。如果您只需要第一个和最后一个参数,您可以编写分别执行这些操作的函数。

获取第一个参数很简单

template <typename First, typename... Ts>
auto first_arg(First const & first, Ts const & ...)
{
  return first;
} 

获取最后一个参数只是稍微复杂一点,但可以通过基本案例重载来完成

template <typename Last>
auto last_arg(Last const & last)
{
  return last;
} 

template <typename First, typename... Ts>
auto last_arg(First const &, Ts const & ... ts)
{
  return last_arg(ts...);
} 

您现在可以在其他需要的地方重用这些函数,在您编写的构造函数中,您可以这样做

template <typename... Tas>
Colordata(Ts... args)
{
  dataFirst = first_arg(args...);
  dataLast = last_arg(args...);
}