C++ 如何使用decltype从空模板容器中提取类型?
正确的C++ 如何使用decltype从空模板容器中提取类型?,c++,templates,types,decltype,C++,Templates,Types,Decltype,正确的decltype语法将如何从特定容器类中提取数据类型,而不会重复使用value\u type成员类型定义 我试图用decltype直接访问一个元素,但我意识到如果容器是空的,它将无法工作。您可以使用 std::remove_reference_t<decltype(std::declval<Container>()[0])> 如果不能假定存在Container::iterator,可以将typename Container::iterator替换为decltype
decltype
语法将如何从特定容器类中提取数据类型,而不会重复使用value\u type
成员类型定义
我试图用decltype
直接访问一个元素,但我意识到如果容器是空的,它将无法工作。您可以使用
std::remove_reference_t<decltype(std::declval<Container>()[0])>
如果不能假定存在Container::iterator
,可以将typename Container::iterator
替换为decltype(std::declval().begin())
您可以使用
std::remove_reference_t<decltype(std::declval<Container>()[0])>
如果你不能假设存在
Container::iterator
,你可以用decltype(std::declval().begin())
替换typename Container::iterator
,严格来说,你也可以通过结合这两种方法并取消引用begin()
@ChristianRau>来避免使用迭代器特性,返回::reference
,这可能是某种奇怪的代理类型,而不是实际的引用。但是操作符[]
,也可能是这样,不是吗?谢谢。但是,正如我不想假设存在value\u type
成员一样,我也不确定在特定的非STL容器上是否存在begin()
。严格来说,通过结合这两种方法并取消引用begin()
@ChristianRau,您也可以避免使用iterator\u traits
,返回::reference
,这可能是某种奇怪的代理类型,而不是实际的引用。但是操作符[]
,也可能是这样,不是吗?谢谢。但是,正如我不想假设存在value\u type
成员一样,我也不确定特定的非STL容器上是否存在begin()
。