Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用decltype从空模板容器中提取类型?_C++_Templates_Types_Decltype - Fatal编程技术网

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