C++ 检测容器是否具有迭代器类型

C++ 检测容器是否具有迭代器类型,c++,templates,stl,C++,Templates,Stl,考虑以下伪代码: template<class Container> int some_function(const Container& container) { if (container has iterator) { // // get an element by its iterator } else { // do another action } } 模板 int some_

考虑以下伪代码:

template<class Container>
int some_function(const Container& container)
{
      if (container has iterator) { // 
            // get an element by its iterator
      } else {
            // do another action
      }
}
模板
int some_函数(常量容器和容器)
{
if(容器有迭代器){//
//通过迭代器获取元素
}否则{
//做另一个动作
}
}
因此,我们有一个函数模板,它采用容器类型(例如,vector、list、valarray或其他类型)。是否可以确定(运行时)给定容器是否具有迭代器类型?编译时?

您使用

#包括
模板
使用迭代器_t=typename t::iterator;
模板
constexpr bool的迭代器=std::experimental::是否检测到;
模板
int some_函数(常量容器和容器)
{
if constexpr(有迭代器){
//通过迭代器获取元素
}否则{
//做另一个动作
}
}
您可以使用

#包括
模板
使用迭代器_t=typename t::iterator;
模板
constexpr bool的迭代器=std::experimental::是否检测到;
模板
int some_函数(常量容器和容器)
{
if constexpr(有迭代器){
//通过迭代器获取元素
}否则{
//做另一个动作
}
}

如果它是一个
STL
容器,那么它有一个迭代器。但是将迭代器作为参数而不是容器通常更灵活/可重用。您需要同时支持容器具有迭代器类型和容器不具有迭代器类型的情况吗?您的代码暗示您需要,但这不是您要问的问题。是的,我想支持这两种情况。我的问题是:确定容器是否具有迭代器类型,并在代码段中将其表示为条件。我想这是我问的一个问题。Galik,valarray是一个容器,因为它包含多个相同类型的元素,并且没有迭代器类型。如果它是
STL
容器,那么它有一个迭代器。但是将迭代器作为参数而不是容器通常更灵活/可重用。您需要同时支持容器具有迭代器类型和容器不具有迭代器类型的情况吗?您的代码暗示您需要,但这不是您要问的问题。是的,我想支持这两种情况。我的问题是:确定容器是否具有迭代器类型,并在代码段中将其表示为条件。Galik,valarray是一个容器,它包含多个相同类型的元素,并且没有迭代器类型。
#include<experimental/type_traits>

template<typename T>
using iterator_t = typename T::iterator;

template<typename T>
constexpr bool has_iterator = std::experimental::is_detected_v<iterator_t, T>;

template<class Container>
int some_function(const Container& container)
{
      if constexpr (has_iterator<Container>) {
            // get an element by its iterator
      } else {
            // do another action
      }
}