我有一个模板类,它接收两种模板类型T,如下所示:
Foo( T arg1,T arg2)
{
}
此类中有一个函数T
用作迭代器。此函数对整数类型的迭代器工作得很好,但对于std :: string类型的迭代器,应以不同的方式实现,
我应该:
首先为整数类型启用第一个函数,然后为
std :: string类型的迭代器专门化该函数
我应该怎么做?!
说“类型的迭代器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,但我将其留给读者练习。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句