如何从C++中的依赖类型中获得它所依赖的类型
How to get the type of what it depends on from a dependent type in C++
假设我在类型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());
这是我在这里发现的一个广义问题:从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{};
}
第二版:为什么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));
}
为什么
Thing
在这里无法推导,有什么原因吗?
因为这属于非推导上下文。
(重点矿井(
在以下情况下用于组成
P
不参与模板参数推导,但使用以下模板参数在别处推导的或明确规定的如果模板参数仅在非推导的上下文中使用,并且没有明确指定,模板参数推导失败
- 嵌套的名称说明符(作用域左侧的所有内容解析运算符
::
(合格id:
例如,
struct my_int_vector {
using iterator = std::vector<int>::iterator;
};
CCD_ 12和CCD_。然后
std::vector<int> v;
auto v2=getContainer(v.begin()); // What should Thing be deduced as ?
auto v3=getContainer(my_int_vector::iterator{}); // What should Thing be deduced as ?
另一个样本可能是
struct my_int_vector {
using iterator = int*;
};
auto v3=getContainer(nullptr); // How could Thing be deduced as my_int_vector based on any information?
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 当基类是依赖类型时,这是一个缺陷吗
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 为什么在以下情况下不需要为依赖类型使用typename
- 提升multi_index获得依赖类型
- 继承依赖类型定义而不使用结构
- 依赖于依赖类型的非静态数据成员的非限定名称
- 依赖类型自动扣除
- 具有unordered_map的依赖类型
- 难以理解C++依赖类型与当前实例化上的内容
- 扣除其他类型的依赖类型
- C++:从依赖类型"Inferring"模板类型
- 编译器是否也将所有参数依赖类型实例化,即使超载函数的参数计数不匹配
- 限定依赖类型的类型定义
- 为什么对于依赖类型,单词 'typedef' 后面需要'typename'?
- 如何从模板化的类方法返回依赖类型
- 无法定义依赖类型定义的成员
- 如何在任意依赖类型上专门化模板
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确