【问题标题】:Specialize template function for string iterator using type traits使用类型特征为字符串迭代器专门化模板函数
【发布时间】:2013-10-28 03:03:20
【问题描述】:

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

Foo( T arg1,T arg2) 
{

}

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

我应该:
首先为整型启用第一个功能
第二个专门针对 std::string 类型的迭代器的函数

我该怎么做?!

【问题讨论】:

  • 不可能。容器的迭代器类型允许像普通指针一样简单,所以不一定能区分std::stringstd::vector<char>的迭代器。
  • 为什么你认为你需要专门针对字符串迭代器?我们通常专门针对迭代器类别(前向、双向、随机等)编写代码。

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


【解决方案1】:

说“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;
}

请注意,这只适用于迭代器(T 需要有一个公共 typedef value_type,而普通指针则没有)。

虽然你没有给出一个明确的用例,所以我只能假设这就是你想要的。

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

【讨论】:

  • 如你所说,迭代器不需要包含嵌套的value_type typedef。但您可以在 trailing-return-type 中使用 typename std::iterator_traits&lt;T&gt;::value_typedecltype(*a)
猜你喜欢
  • 2021-08-21
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多