gpt4 book ai didi

c++ - 如何从 C++ 中的依赖类型获取它所依赖的类型

转载 作者:行者123 更新时间:2023-12-01 15:10:27 34 4
gpt4 key购买 nike

假设我定义了一个类型 iterator内字Container , 所以这种类型的对象是 Container::iterator .我怎样才能得到它所依赖的类型,即Container

struct Container
{
struct iterator {};
};

template<typename Cont>
auto getContainer(typename Cont::iterator&& iter)
{
return Cont{}; //return an empty container from the iterator, but type of Cont canNOT be deduced :(
}

//example
std::vector<int> v;
auto v2=getContainer(v.begin());

这是我在这里发现的一个普遍问题:Obtain container type from (its) iterator type in C++ (STL)但由于它已经 10 岁了,我敢打赌可能会有一些神奇的解决方案。

编辑:我将问题归纳为依赖类型,而不是特定于容器,正如某些人可能建议的那样 std::vector<T>::iterator作为指针实现

假设有一些类型,都定义了一个共同的typename里面

struct Something { struct SomeInnerType{}; };
struct SomeOtherThing { struct SomeInnerType{}; };

template<typename Thing>
auto getDepend(typename Thing::SomeInnerType&& obj)
{ //^ why this can't be deduced (EDIT2)
return Thing{};
}

EDIT2:为什么是Thing这里不能推导,这是什么原因?

最佳答案

如果要从内部迭代器类型中减去外部容器类型,则必须在迭代器内定义容器类型:

struct Container {
public:
struct iterator {
public:
using container_type = Container;
};
};

然后您必须将迭代器类型传递给 getContainer 函数,而不是容器类型:

template <typename TIter>
TIter::container_type getContainer(TIter&& iter) {
return typename TIter::container_type {};
}

这样您就可以解决向模板提供请求的容器的问题:

int main() 
{
auto it = Container::iterator();
auto c = getContainer(std::move(it));
}

关于c++ - 如何从 C++ 中的依赖类型获取它所依赖的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62909005/

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