gpt4 book ai didi

c++ - 类模板的内部类的类元组结构化绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 21:32:42 26 4
gpt4 key购买 nike

我想为类模板的内部类提供结构化绑定(bind)。我如何为该内部类专门化 std::tuple_size

我不能使用到数据成员的结构化绑定(bind),因为内部类可能是与该功能不兼容的类型。所以我需要提供类似元组的结构化绑定(bind)。为了向内部类提供这样的功能,我需要在 namespace std 中部分特化 std::tuple_size。问题是我得到了参数 T(外部类的)的非推导上下文

我知道我可以将内部类放在全局命名空间中,从而解决所有问题,但是有什么方法可以在保持类内部的情况下获得相同的结果吗?

#include <tuple>

template<typename T>
class Collection
{
public:
struct Element
{
int id;
T actual_element;
};

//...
};


namespace std
{
template<typename T>
struct tuple_size<typename Collection<T>::Element> // Error! Non-deduced context
: std::integral_constant<std::size_t, 2> {};
}



//Collection iterators...

int main()
{
Collection<int> collection;

for (auto & [id, element] : collection) //what I'd like to achieve
//do some stuff...
}

最佳答案

您不必为这种情况提供绑定(bind):Element已经可以分解了:

struct Element { int i, j; };
auto [i, j] = Element{2, 3}; // ok

但是,假设 Element实际上更复杂并且需要自定义绑定(bind),那么是的 - 您需要将其移出。但是,它不需要位于全局 namespace 中。它可能在其他地方:

namespace detail {
template <typename T> struct Element { ... };
}

template<typename T>
class Collection
{
public:
using Element = detail::Element<T>;
friend Element;
// ...
};

到那时,专门化绑定(bind)就很简单了。没有办法解决,因为正如您指出的那样,专注于 Collection<T>::Element是一个非推导上下文。


缺少一种新的语言功能,可以让您在类主体本身中选择加入结构化绑定(bind)。有这样一篇论文,P1096 , 但提交时被拒绝了。这并不是说新提案不能做得更好。

关于c++ - 类模板的内部类的类元组结构化绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54045121/

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