解压缩ts . .到t1.a(), t1.b(), t1.a(), t1.b(),
Unpack ts... to t0.a(), t0.b(), t1.a(), t1.b(),
我想以以下方式从一个可变参数函数调用另一个可变参数函数:
template <typename ...Ts>
void f(Ts const & ...) { /* ... */ }
template <typename ...Args>
void g(Args const & ...args)
{
// shall call f(arg0.a(), arg0.b(), arg1.a(), arg1.b(), ...)
}
我是这样做的:
struct sentinel_t { };
template <typename Arg, typename ...Args>
void g_impl(Arg const & arg, Args const & ...args)
{
g_impl(args..., arg.a(), arg.b());
}
template <typename ...Ts>
void g_impl(sentinel_t , Ts const & ...ts)
{
f(ts...);
}
template <typename ...Args>
void g(Args const & ...args)
{
g_impl(args..., sentinel_t{});
}
是否有其他/更好的方法来实现这个模式?
template <class... Args> void g(Args const &... args) {
impl::apply([](auto const &... p) { f(p...); },
std::tuple_cat(std::forward_as_tuple(args.a(), args.b())...));
}
在std::apply
标准化之前,你可以用c++14(取自参考论文)制作你自己的非常简单的代码:
namespace impl {
template <typename F, typename Tuple, size_t... I>
decltype(auto) apply_impl(F &&f, Tuple &&t, std::index_sequence<I...>) {
return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);
}
template <typename F, typename Tuple> decltype(auto) apply(F &&f, Tuple &&t) {
using Indices =
std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>;
return apply_impl(std::forward<F>(f), std::forward<Tuple>(t), Indices{});
}
}
你可以这样做
namespace detail
{
// dispatcher
template <typename T>
decltype(auto) call_a_b(std::integral_constant<std::size_t, 0u>, const T& arg) {return arg.a();}
// dispatcher
template <typename T>
decltype(auto) call_a_b(std::integral_constant<std::size_t, 1u>, const T& arg) {return arg.b();}
template <std::size_t... Is, typename Tuple>
void call_f_a_b(std::index_sequence<Is...>, const Tuple& tuple)
{
f(call_a_b(std::integral_constant<std::size_t, Is % 2>{}, std::get<Is / 2>(tuple))...);
}
}
template <typename...Ts>
void g(const Ts&... args)
{
return detail::call_f_a_b(std::make_index_sequence<2 * sizeof...(Ts)>{}, std::tie(args...));
// call f(arg0.a(), arg0.b(), arg1.a(), arg1.b(), ...)
}
现场演示
相关文章:
- 概念TS检查忽略私有访问修饰符
- 什么是自动 t1=std::make_tuple(case1==case2,整数)的值
- 从 TS 到C++的平面缓冲区不起作用
- 范围TS成语和神秘的汽车&&
- TS 概念类型名约束
- 迭代器的范围 TS 和 C++20 概念是否需要能够使用"运算符>"?
- 如何使用标准库网络 TS 在服务器和客户端之间发送消息C++
- 快速 TS 片段 ffmpeg 解码 - 内存泄漏
- 在Visual Studio中更新Qt翻译(.ts文件)时出现未指定错误
- 如何使用 cmake 来确保 C++14 编译器与实验文件系统 TS 库的链接?
- C++范围 TS 包括实验路径
- 如何检查类型 T 是否在参数包 Ts 中
- 范围中的"range"和"view"有什么区别sv3 ts?
- Clang and C++ Module TS
- 在 Linux 上使用带有标准标头的C++模块 TS
- Qt中C++构建器的TS选择替代方案
- <T> 从类型对象创建类型<T1>对象的构造函数
- 为 map<T1、T2> 迭代器创建模板函数
- 我可以将 std::variant<Ts...> 分配给/从 std::variant<Ts..., Ys...> 分配/构造一个 std::variantTs... 吗?
- 解压缩ts . .到t1.a(), t1.b(), t1.a(), t1.b(),