0

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

Foo( T arg1,T arg2) 
{

}

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

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

我该怎么做?!

4

1 回答 1

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 但我将把它作为练习留给读者。

于 2013-10-19T12:47:45.783 回答