C++ 使用类型特征专门化字符串迭代器的模板函数
我有一个模板类,它接收两种模板类型T,如下所示: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。我假设是后者,因为您还提
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
需要具有公共类型defvalue\u type
,这是普通指针所不具备的)
不过,您没有给出明确的用例,所以我只能假设这是您想要的
如果您需要它来处理指针(因为指针在技术上是迭代器),您可以使用std::is_指针和std::remove_指针,但我将把它作为练习留给读者。这是不可能的。容器的迭代器类型允许像普通指针一样简单,因此您不必区分
std::string
和std::vector
的迭代器。为什么您认为需要这样做专门用于字符串迭代器?我们通常专门用于迭代器类别(正向、双向、随机等)的代码。正如您所说,迭代器不需要包含嵌套的value\u type
typedef。但您可以在尾部返回类型中使用typename std::iterator\u traits::value\u type
,或decltype(*a)
。