c++ - 如何从对象 std::tuple 获取对元组尾部的引用
问题描述
我已经定义:
template<class Head,class ...Tail>
struct elem{
std::tuple<Head,Tail...> dm;
};
我有用于类 elem 的函数 head()、tail() 和其他函数,但它们创建副本,它们返回元组头部或元组尾部的副本,但我需要引用 this-> DM。
因为头很容易,std::get<0>(this->dm)
给我参考。
尾巴可以吗?尾部是指第一个元素之后的所有元素。
解决方案
tuple<A, B, C>
只有当 a在内部存储为与 cons 单元等效的东西时,这样的事情才有可能:
struct __tuple_A_B_C {
A car;
tuple<B, C> cdr;
A& head() { return car; }
tuple<B, C>& tail() { return cdr; }
};
但事实并非如此——你所知道的只是你有类型A
、B
和的子对象C
。它们的布局是完全未指定的——你肯定不知道实现是否使用像这样的递归来实现tuple
。他们被允许,但我不确定是否有人这样做。
你能做的最好的事情是,给定一个tuple<A, B, C>
回报 a tuple<B&, C&>
。在 C++17 中,实现起来还不错:
template<class Head,class ...Tail>
struct elem{
std::tuple<Head,Tail...> dm;
auto tail() {
return std::apply([](auto&, auto&... rest){
return std::tie(rest...);
}, dm);
}
};
但是如果你真的想要这种递归的 cons-cell-like 方法,你可能最好实际实现自己的递归,这样你就可以获得所需的行为:
template <class Head, class... Tail>
struct elem {
Head head;
elem<Tail...> tail;
};
template <class Head>
struct elem<Head> {
Head head;
};
取决于你实际在做什么。
推荐阅读
- java - 运行 SampleApp 消息连接超时错误
- javascript - 将日期作为字符串传递给后端和服务器
- haskell - 将.hs文件作为脚本运行时如何导入相邻模块
- python - OpenCV 检测具有多个边界框的单个符号
- azure - 多个 LEFT JOINS 在 Azure 流分析中未按预期工作
- python - 时间序列:如何在包含星期六的情况下调整 pd.date_range(freq='B')。(Python)
- ios - UITabBarController 未正确初始化选项卡视图控制器
- pytorch - 输入张量未在 pytorch 中移动到 GPU
- java - 具有在其回调中使用具体类的侦听器的抽象 Java 类
- java - 使用 for 循环从列表中删除电影。For循环工作一次然后抛出索引超出范围异常