当前位置: 首页 > 知识库问答 >
问题:

为类提供类似元组的结构化绑定访问

寿翰飞
2023-03-14

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

struct Test
{
    int v = 42;
};

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

为了能够像元组一样访问Test的成员,我们必须专门化std::tuple_sizestd::tuple_元素

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;
};

}

我们需要的最后一部分是测试::

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):

“std::tuple_元素”类型的绑定引用

因此,似乎get

然而,根据这一点,行auto[v]=test;应该大致相当于

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

因为它使用了get

关于我的get实现为什么不适用于结构化绑定,有什么想法吗?


共有1个答案

丰胤运
2023-03-14

问题是,auto[v]是一个非引用声明,因此test被复制,而test的副本作为x值传递给get

因此,您需要添加一个右值限定get:

template<std::size_t I>
int&& get(Test&& t)
{
    return std::move(t.v);
}
 类似资料:
  • 在该示例中,标识符和之间的相应区别是什么?据我所知,结构绑定中的也有一个引用类型,但是为什么为它指明了一个非引用类型呢?

  • 我试图理解C17中引入的结构化绑定。对我来说,关于cp首选项的解释并不明显,但看起来像 大致相当于(不考虑数组的情况) 这里的关键点是,不是独立定义的变量,而是返回值成员的别名。和应用于返回值,而不是别名(这里的语法可能会误导)。例如,请参见CPPPreference示例 如果是独立定义的变量,则

  • 简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理

  • 问题内容: 我正在优化一些代码,这些代码的主要瓶颈正在运行并访问大量类似于结构的对象。目前,我使用namedtuples来提高可读性。但是使用’timeit’进行的一些快速基准测试表明,在性能是一个重要因素的情况下,这确实是错误的方法: 以a,b,c命名的元组: 使用,a,b,c的类: 带有键a,b,c的字典: 使用常量键的具有三个值的元组: 使用常数键列出三个值: 使用本地键的具有三个值的元组:

  • 问题内容: 请记住,JSON结构事先是未知的,即它是完全任意的,我们只知道它是JSON格式。 例如, 以下JSON 应该反序列化为具有类似key的类似Map的结构(为简洁起见,不包括以上所有内容): 我目前正在调查杰克逊,所以我们有: 但是,生成的Map实例基本上是嵌套Map的Map: 我需要使用“圆点表示法”的扁平化键和扁平化键,如上。 我不希望自己实现此功能,尽管目前我看不到其他任何方式。 问

  • 问题内容: 我是Java的新手,我试图找到一种方法来在C语言中存储诸如结构之类的信息。例如,说我想让一名程序雇用员工。它将从用户那里获得一个名字,姓氏和ID号并将其存储起来。然后,用户可以根据条件查看该信息(例如,如果数据库有多于1名员工)。有没有人建议这样做的最佳方法? 问题答案: C中的结构就像Java中的类一样,功能更强大,因为Java中的类可以包含方法,而C ++可以。您创建一个新类。例如