gpt4 book ai didi

c++ - 使用结构化绑定(bind)的“反射”

转载 作者:行者123 更新时间:2023-12-01 13:06:44 34 4
gpt4 key购买 nike

我想知道是否可以使用 fact that in

struct Foo
{
int x;
};

int main()
{
Foo foo;
auto [a0] = foo;
auto [a1, b1] = foo;
auto [a2, b2, c2] = foo;
// auto [a, b, c, ...] = foo;
}
只有第一个结构化绑定(bind)是有效的,以便创建采用任何 pod 类型并返回由传递的 pod 的所有成员类型组成的元组的元函数,例如对于 Foo 它会返回
std::tuple<int>
我尝试了这样的事情,但没有成功:
#include <tuple>
#include <type_traits>
#include <utility>

using namespace std;

template<typename T, typename U = void>
struct to_tuple;

template<typename T>
struct to_tuple<T, void_t<decltype([](T x) {
auto [a] = x;
return make_tuple(a);
}(declval<T>()))>>
{
using type = decltype([](T x) {
auto [a] = x;
return make_tuple(a);
}(declval<T>()));
};

template<typename T>
struct to_tuple<T, void_t<decltype([](T x) {
auto [a, b] = x;
return make_tuple(a, b);
}(declval<T>()))>>
{
using type = decltype([](T x) {
auto [a, b] = x;
return make_tuple(a, b);
}(declval<T>()));
};

template<typename T>
using to_tuple_t = typename to_tuple<T>::type;

struct Bar1
{
int x;
};

struct Bar2
{
int x;
float y;
};

int main()
{
static_assert(is_same_v<to_tuple_t<Bar1>, tuple<int>>);
static_assert(is_same_v<to_tuple_t<Bar2>, tuple<int, float>>);
}

最佳答案

这里的主要问题是结构化绑定(bind)声明只是一个声明。我们无法形成“结构化绑定(bind)表达式”来获取类型,这是元编程中约束模板所必需的(例如,void_t 模式,或 concept/requires 子句)

根据 [dcl.struct.bnd] ,尽管存在赋值表达式,结构化绑定(bind)显然是 声明 .
模板元编程依赖于类型,而声明没有类型。
例如,您不能说 decltype(int a = 10)甚至decltype(int a)为此原因。
你可以说decltype(int{})因为现在我们有了一个表达式。
因此,您的 void_t模式不起作用。
不幸的是,概念/约束对我们没有帮助,因为我们不能在 requires 子句中声明(根据 [gram.expr])

就我个人而言,我认为我们不能拥有 int{} 的等价物有点疏忽了。用于结构化绑定(bind)。但是话又说回来,无论如何,反射(reflection)正在进行中,所以这一点可能没有实际意义。
编辑:作为 dfri pointed out ,有一个名为 statement expressions 的 GNU 扩展这可以使这成为可能(作为扩展,它是可理解的不可移植代码)

关于c++ - 使用结构化绑定(bind)的“反射”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62692631/

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