正确的decltype
语法从特定的容器类中提取数据类型而又不会重复使用value_type
成员typedef是什么?
我试图用decltype<std::declval<myContainerClass>[0]>
直接访问一个元素,但是我意识到如果容器为空,它将无法正常工作。
答案 0 :(得分:4)
您可以使用
std::remove_reference_t<decltype(std::declval<Container>()[0])>
decltype
中的所有内容均未评估,因此访问假定的空容器的元素0为UB的事实无关紧要。这只是从容器的operator[]
中提取必要的类型信息。您需要remove_reference
,因为operator[]
可能返回左值引用。
但是,这不适用于std::list<T>
之类的容器。相反,您可以使用:
typename std::iterator_traits<typename Container::iterator>::value_type
如果不能假设Container::iterator
存在,则可以将typename Container::iterator
替换为decltype(std::declval<Container>().begin())
。