c++ - C++ 将同构包装类型的元组转换为原始类型的元组
问题描述
我想调用std::apply()
一个函数;但是,我无法这样做,因为std::tuple
我使用的当前已包装。例如:
#include <tuple>
template <class T>
struct wrapped
{
wrapped(T t) : t(t) {}
T t;
};
template <class T, class ... Args>
struct delay_call
{
T(*callback)(Args...);
std::tuple<Args...> params;
delay_call(T(*callback)(Args...), Args ... params) :
callback(callback), params(params...)
{}
T call()
{
return std::apply(callback, params);
}
};
template <class T, class ... Args>
struct delay_call_with_wrap
{
T(*callback)(Args...);
std::tuple<wrapped<Args>...> w_params;
delay_call_with_wrap(T(*callback)(Args...), wrapped<Args> ... w_params) :
callback(callback), w_params(w_params...)
{}
T call()
{
std::tuple<Args...> params; // = w_params.t
return std::apply(callback, actual_params);
}
};
float saxpy(float a, float x, float y)
{
return a * x + y;
}
int main()
{
float a = 1, x = 2, y = 3;
delay_call delay_saxpy(saxpy, a, x, y);
wrapped w_a = 1.f, w_x = 2.f, w_y = 3.f;
delay_call_with_wrap w_delay_saxpy(saxpy, w_a, w_x, w_y);
float result = delay_saxpy.call();
float w_result = w_delay_saxpy.call();
}
delay_call 结构按预期工作;但是,我不确定如何提取每个元组元素的实际值并将其std::apply()
交给执行。
简而言之,对于delay_call_with_wrap::call
,我将如何转换std::tuple<wrapped<Args>...>
为 a std::tuple<Args...>
?
解决方案
我会完全避免并通过使用以下方式解包元组来直接std::apply
调用:callback
std::index_sequence
template <std::size_t ...I> T call_low(std::index_sequence<I...>)
{
return callback(std::get<I>(w_params).t...);
}
T call()
{
return call_low(std::make_index_sequence<sizeof...(Args)>{});
}
推荐阅读
- php - Facebook 如何手动构建登录流程 (PHP) 错误“您的 redirect_uri 与您在 OAuth 对话请求中使用的不同”
- android - 红色或蓝色类别 Android Studio
- wordpress - woocommerce结帐页面字段中的条纹表单问题未显示
- javascript - 在选择元素中设置默认选项并加载数据
- mqtt - MQTT + (protocolbuf / flatbuf) = DDS?
- python - 如何使用 ttk.style tkinter 更改滚动条的颜色
- angular - 在 Angular 10 中获取新的访问令牌后订阅未执行
- python - 从列表中的列表中获取项目
- reactjs - 如何在 Material UI 的 Slider 中将 null 设置为默认值
- php - 交易后如何在会员新闻感谢页面上添加 GA 跟踪