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

时间:2013-10-19 07:44:57

标签: c++ templates c++11 typetraits

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

Foo( T arg1,T arg2) 
{

}

这个类中有一个函数使用T作为迭代器。这个函数适用于整数类型的迭代器,但对于std :: string类型的迭代器应该以不同的方式实现,

我应该:
首先为积分类型启用第一个函数
第二个专门为std :: string类型

的迭代器的函数

我该怎么做?!

1 个答案:

答案 0 :(得分:1)

说'std::string'类型的迭代器不是很清楚。你要么意思是std :: string :: iterator,要么是std :: iterator< std :: string>。我假设后者,因为你也提到了'整数类型的迭代器',在这种情况下,以下内容可以实现你想要的:

#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;
}

请注意,这只适用于迭代器(T需要有一个公共typedef value_type,普通指针不会有这种情况。

你没有给出明确的用例,但我只能假设这是你想要的。

如果你需要它来处理指针(因为指针是技术上的迭代器),你可以使用std :: is_pointer和std :: remove_pointer,但我会把它作为读者的练习。