c++ - 将元组和整数实例合并到引用元组中
问题描述
在尝试从元组和整数值的混合中构造引用元组时,我遇到了奇怪的行为。
鉴于以下情况:
struct A { int v = 1; };
struct B { int v = 2; };
struct C { int v = 3; };
A a;
std::tuple<B,C> tpl;
我正在尝试创建第三个元组,它包含对所有实例的引用,以便每个实例v
都可以通过它进行分配和读取。
使用模板似乎很简单
template <class Tuple, size_t... Is>
constexpr auto as_ref_impl(Tuple t, std::index_sequence<Is...>) {
return std::tuple_cat(std::tie(std::get<Is>(t))...);
// or
// return std::make_tuple(std::ref(std::get<Is>(t))...);
}
template <class...Args>
constexpr auto as_ref(std::tuple<Args...>& t) {
return as_ref_impl(t, std::index_sequence_for<Args...>{});
}
进而
auto ref_tpl = std::tuple_cat(std::tie(a), as_ref(tpl));
构建良好(在两个版本中)。
ref_tpl
不幸的是,只有源自整数值的引用元组 ( ) 的部分可以被成功分配或读取。
我正在使用C++14
和gcc 9.3.0
。
非常欢迎任何想法或见解为什么这不起作用!
最小的工作示例:
#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>
#include <functional>
struct A { int v = 1; };
struct B { int v = 2; };
struct C { int v = 3; };
A a;
std::tuple<B,C> tpl;
template <class Tuple, size_t... Is>
constexpr auto as_ref_impl(Tuple t, std::index_sequence<Is...>) {
//return std::tuple_cat(std::tie(std::get<Is>(t))...);
return std::make_tuple(std::ref(std::get<Is>(t))...);
}
template <class...Args>
constexpr auto as_ref(std::tuple<Args...>& t) {
return as_ref_impl(t, std::index_sequence_for<Args...>{});
}
int main() {
using std::cout;
auto ref_tpl = std::tuple_cat(std::tie(a), as_ref(tpl));
// prints 1 2 3, as expected.
cout << a.v << std::get<0>(tpl).v << std::get<1>(tpl).v << std::endl;
std::get<0>(ref_tpl).v = 8; // works
std::get<1>(ref_tpl).v = 9; // does not work
std::get<2>(ref_tpl).v = 10; // does not work
// should output 8 9 10 instead outputs 8 2 3
cout << a.v << std::get<0>(tpl).v << std::get<1>(tpl).v << std::endl;
// should output 8 9 10, instead outputs garbage.
cout << std::get<0>(ref_tpl).v << std::get<1>(ref_tpl).v << std::get<2>(ref_tpl).v << std::endl;
return 0;
}
解决方案
这是一个简单的错字:
constexpr auto as_ref_impl(Tuple t, std::index_sequence<Is...>) {
Tuple
是按值取值的,因此会制作一个本地副本,并相对于它进行引用。
你应该Tuple
参考参考,
constexpr auto as_ref_impl(Tuple& t, std::index_sequence<Is...>) {
推荐阅读
- flutter - 使用 Getx Flutter 按 ID 获取产品
- windows - 我可以在运行 Windows/WSL2 的远程主机上的容器中使用 VS Code 进行开发吗?
- excel - 在 Excel 中按行生成随机(“是”、“否”)并使 10% 的随机行具有值“是”,其余为“否”值
- python - 创建唯一实例有效,但再次调用类时如何获取引用?
- python - Python:如何在函数中获取未指定的参数名称(*args)
- php - 如何使用 Codeigniter 从数据库中解密加密密码
- javascript - 如何通过 localStorage.getItem() 恢复值
- node.js - 使用 SQL Server 和 Hapi.Dev 登录的 Auth.js 文件出现问题
- python - 带有重复项的子集,仅返回空列表的问题
- selenium - 动态 WebElement 使 ElementNotInteractable 异常