使用类型特征为字符串迭代器专门化模板函数
Specialize template function for string iterator using type traits
我有一个模板类,它接收两种模板类型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,但我会把它留给读者练习。
相关文章:
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 专门化模板覆盖函数/避免对象切片
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 如何在编译时专门化大型模板函数中的小部分
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 使用decltype尾部返回类型专门化函数模板
- 为模板化派生类专门化函数模板
- C++模板-专门化函数
- 在单独的.cpp文件中专门化函数模板
- 创建专门化函数模板的最佳方法是什么?
- 用泛型返回类型专门化函数
- 可以将运行时确定的模板参数传递给专门化函数吗?
- 根据调用方/上下文专门化函数的行为
- 专门化函数从其他函数调用
- c++中专门化函数模板的语法
- c++对枚举的专门化函数