如何将可变函数参数转换为数组?
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...);
}
如何将可变函数参数转换为数组? 我需要这样的东西:
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...);
}