【发布时间】:2020-07-15 06:43:49
【问题描述】:
假设我在类型Container 中定义了一个类型iterator,那么这个类型的对象就是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这里不能推导出来,有什么原因吗?
【问题讨论】:
-
“get”是什么意思?类型信息应该有什么形状?你想怎么用?
-
不,和 10 年前一样。
-
我认为这通常是不可能的。例如,连续容器的迭代器,例如
std::vector,可以简单地实现为指针。如何从普通指针中“提取”有关容器的信息? -
Works for me。 ???你怎么称呼
getContainer? -
@Carsten 这显然不是我使用
getContainer的目的,因为您明确专门化了该类型。我要自动扣款解决方案