gpt4 book ai didi

c++ - 为类提供类似元组的结构化绑定(bind)访问

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:02 27 4
gpt4 key购买 nike

我正在尝试为一个类支持类似元组的结构化绑定(bind)访问。为简单起见,我将在本文的其余部分使用以下类:

struct Test
{
int v = 42;
};

(我知道这个类支持开箱即用的结构化绑定(bind),但我们假设它不支持。)

收件人enable tuple-like accessTest的成员,我们必须专业std::tuple_sizestd::tuple_element :

namespace std
{

template<>
struct tuple_size<Test>
{
static const std::size_t value = 1;
};

template<std::size_t I>
struct tuple_element<I, Test>
{
using type = int;
};

}

我们需要的最后一部分是 Test::get<i>或函数 get<i>(Test)Test的命名空间。让我们实现后者:

template<std::size_t I>
int get(Test t)
{
return t.v;
}

这行得通。但是,我想返回对 Test 的引用的成员,就像 std::get(std::tuple) , 例如。因此,我执行 get如下:

template<std::size_t I>
int& get(Test& t)
{
return t.v;
}

template<std::size_t I>
const int& get(const Test& t)
{
return t.v;
}

然而,对于这个版本,下面的代码

auto test = Test{};
auto [v] = test;

产生错误(GCC 7.1):

binding reference of type ‘std::tuple_element<0, Test>::type& {aka int&}’ to ‘const int’ discards qualifiers

所以看起来好像 get<i>(const Test&)为结构化绑定(bind)选择了重载。由于此重载返回 const int& , 和 v就像一个非 const引用int ,代码编译失败。

根据 this ,但是,行 auto [v] = test;应该大致相当于

auto e = test;
std::tuple_element<0, Test>::type& v = get<0>(e)

哪个可以工作,因为它使用了 get<i>(Test&)过载。

关于我为什么实现 get 的任何想法不适用于结构化绑定(bind)?

最佳答案

问题是auto [v]是一个非引用声明,所以复制了test,传递了test的拷贝以 get 作为 xvalue。

所以需要加一个右值限定的get:

template<std::size_t I>
int&& get(Test&& t)
{
return std::move(t.v);
}

关于c++ - 为类提供类似元组的结构化绑定(bind)访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45699005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com