【发布时间】:2017-02-07 16:10:45
【问题描述】:
是否可以使用结构化绑定语法来确定我应该在方括号中指定多少个变量名,以匹配普通右侧 struct 的数据成员数?
我想成为通用库的一部分,它使用结构化绑定将任意类分解为其组成部分。目前还没有结构化绑定的可变参数版本(而且,我认为,不能用于当前建议的语法),但我的第一个想法是对某些函数 decompose() 进行一组重载,它执行 struct 的分解参数转化为一组它的成分。 decompose() 应该被参数的数量(即struct)数据成员重载。目前constexpr if 语法也可以用来调度这个。但是为了上述目的,我怎样才能模拟类似于sizeof... 运算符的东西呢?我不能在 SFINAE 结构中的某处使用auto [a, b, c] 语法,因为它是分解声明,AFAIK 任何声明都不能在decltype 中使用,我也不能在正文中将其用于我的目的lambda 函数,因为 lambda 函数也不能在模板参数中使用。
我当然想要内置运算符(语法类似于sizeof[] S/sizeof[](S) 用于class S),但也可以接受以下内容:
template< typename type, typename = void >
struct sizeof_struct
{
};
template< typename type >
struct sizeof_struct< type, std::void_t< decltype([] { auto && [p1] = std::declval< type >(); void(p1); }) > >
: std::integral_constant< std::size_t, 1 >
{
};
template< typename type >
struct sizeof_struct< type, std::void_t< decltype([] { auto && [p1, p2] = std::declval< type >(); void(p1); void(p2); }) > >
: std::integral_constant< std::size_t, 2 >
{
};
... etc up to some reasonable arity
也许constexpr lambda 将允许我们将它们用于模板的参数。你怎么看?
即将到来的概念有可能吗?
【问题讨论】:
-
AFAIK lambda 不会在
decltype中可用,不是因为它们不是constexpr,而是因为每次使用 lambda 语法都会创建一个全新的类型,这将混淆模板实例化逻辑一个很多。 -
@Quentin 很伤心。我认为这会很好,如果任何文字类型的值都可以成为非类型模板参数。我确信会有一些问题,但是这种模板的实例可能会被禁止用于任何类型的导出。在这种情况下,它们仍然可以用于通用代码。
-
我在这里之前的问答中找到了partial answer(对于没有(甚至是空的)基数的类是正确的)。但是问题的其余部分的答案是什么?
-
Here 是一个可能的用例。
-
@W.F.不,这意味着如果你想让你的结构被分解,并且默认不会削减它(例如,它没有所有公共数据成员,那些数据成员不来自同一个类,并非所有人都应该参与,或者您希望其中一些人使用不同的类型),您专攻
tuple_size/tuple_element/get。
标签: c++ variadic-templates typetraits c++17 structured-bindings