簡體   English   中英

使用類型特征專門化字符串迭代器的模板功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM