C++ 使用类型特征专门化字符串迭代器的模板函数

C++ 使用类型特征专门化字符串迭代器的模板函数,c++,templates,c++11,typetraits,C++,Templates,C++11,Typetraits,我有一个模板类,它接收两种模板类型T,如下所示: Foo( T arg1,T arg2) { } 此类中有一个函数使用T作为迭代器。该函数对于整数类型的迭代器非常有效,但对于std::string类型的迭代器,其实现方式应该有所不同 我应该: 首先仅为整型启用第一个功能 第二,专门化std::string类型迭代器的函数 我该怎么做 说“std::string类型的迭代器”不是很清楚。您指的是std::string::iterator,或std::iterator。我假设是后者,因为您还提

我有一个模板类,它接收两种模板类型T,如下所示:

Foo( T arg1,T arg2) 
{

}
此类中有一个函数使用
T
作为迭代器。该函数对于整数类型的迭代器非常有效,但对于std::string类型的迭代器,其实现方式应该有所不同

我应该:
首先仅为整型启用第一个功能
第二,专门化std::string类型迭代器的函数


我该怎么做

说“std::string类型的迭代器”不是很清楚。您指的是std::string::iterator,或std::iterator。我假设是后者,因为您还提到了“整数类型的迭代器”,在这种情况下,以下内容实现了您想要的:

#include <iostream>
#include <vector>
#include <string>
#include <type_traits>

template< typename T >
void foo( typename std::enable_if< std::is_integral< typename T::value_type >::value, T >::type a, T b )
{
    std::cout << "integral iterator\n";
}

template< typename T >
void foo( typename std::enable_if< std::is_same< typename T::value_type, std::string >::value, T >::type a, T b )
{
    std::cout << "string iterator\n";
}

int main() 
{
    std::vector< std::string > vecStr;
    std::vector< int > vecInt;

    foo( vecStr.begin(), vecStr.end() );
    foo( vecInt.begin(), vecInt.end() );

    return 0;
}
#包括
#包括
#包括
#包括
模板
void foo(如果::value,T>::type a,tb,则typename std::enable_)
{
标准::cout
void foo(typename std::enable_如果::value,T>::type a,tb)
{
std::cout-vecStr;
标准::向量vecInt;
foo(vecStr.begin(),vecStr.end());
foo(vecInt.begin(),vecInt.end());
返回0;
}
请注意,这仅适用于迭代器(
T
需要具有公共类型def
value\u type
,这是普通指针所不具备的)

不过,您没有给出明确的用例,所以我只能假设这是您想要的


如果您需要它来处理指针(因为指针在技术上是迭代器),您可以使用std::is_指针和std::remove_指针,但我将把它作为练习留给读者。

这是不可能的。容器的迭代器类型允许像普通指针一样简单,因此您不必区分
std::string
std::vector
的迭代器。为什么您认为需要这样做专门用于字符串迭代器?我们通常专门用于迭代器类别(正向、双向、随机等)的代码。正如您所说,迭代器不需要包含嵌套的
value\u type
typedef。但您可以在尾部返回类型中使用
typename std::iterator\u traits::value\u type
,或
decltype(*a)