c++ - 是否可以通过推导指南实现整个 std::make_tuple 功能?
问题描述
这里指出 C++17 中的推导指南将std::make_tuple
过时。std::make_tuple
但是,据我了解,与标准推导指南之间的区别在于std::tuple::tuple
,给定 a std::reference_wrapper
,std::make_tuple
将推导出参考。
如何使用扣除指南实施扣除?类似的东西,但扩展到Args...
具有以下内容的模板std::tuple::tuple
:
#include <tuple>
#include <functional>
template <typename T>
struct Element {
Element(std::reference_wrapper<std::decay_t<T>> rw) : value_{rw.get()} {}
Element(T t) : value_{std::move(t)} {}
T value_;
};
template <typename T> Element(T) -> Element<T>;
template <typename T> Element(std::reference_wrapper<T>) -> Element<T&>;
template <typename T> Element(std::reference_wrapper<const T>) -> Element<const T&>;
struct A {
int i;
};
int main()
{
A a{10};
Element wa{std::ref(a)};
static_assert(std::is_lvalue_reference_v<decltype(wa.value_)>);
Element wb{A{15}};
static_assert(std::is_object_v<decltype(wb.value_)>);
}
例子。
解决方案
template<class T> struct unwrap { using type = T; };
template<class T> struct unwrap<reference_wrapper<T>> { using type = T&; };
template<class... Ts>
tuple(Ts...) -> tuple<typename unwrap<T>::type...>;
推荐阅读
- flutter - Dart Flutter 导入和扩展有什么区别?
- java - 如何读取用户输入到具有设定大小的数组中的输入量?
- javascript - 检查文件是否从 GCS 在 GCF 中的 temp 中下载
- flutter - 带有微调器设计的日期选择器
- c# - IdentityServer 4 Entity Framework ConfigurationDbContext Client.AllowedScopes 和其他非客户端表属性为 Null
- email - 作为收件人,是否可以检测电子邮件是通过 Gmail 的“计划发送”还是“发送”发送的?
- tabs - 如何在没有 APP 的情况下在 Shopify 中制作产品描述选项卡?
- nosql - 在一个 NoSQL 表中保存不同类型的数据是一种很好的模式吗?
- python - 如何使回调函数可用于 Python 中的导入模块?
- c# - 更好地理解 Kaitai Struct 的 32 位转换器