[英]Specialize template function for string iterator using type traits
我有一個模板類,它接收以下兩種模板類型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,但我將其留給讀者練習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.