如何使用decltype从空的模板容器中提取类型?

时间:2018-11-16 17:59:50

标签: c++ templates types decltype

正确的decltype语法从特定的容器类中提取数据类型而又不会重复使用value_type成员typedef是什么?

我试图用decltype<std::declval<myContainerClass>[0]>直接访问一个元素,但是我意识到如果容器为空,它将无法正常工作。

1 个答案:

答案 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())