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

Specialize template function for string iterator using type traits

本文关键字:专门化 函数 迭代器 字符串 类型 特征      更新时间:2023-10-16

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

Foo( T arg1,T arg2) 
{
}

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

我应该:
首先启用仅针对整型
的第一个函数第二个专门用于 std::字符串类型的
迭代器的函数

我应该怎么做?!

"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 iteratorn";
}
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 iteratorn";
}
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,但我会把它留给读者练习。