2017-06-29 36 views
2

我有一些泛型函數返回<T>類型的變量。我將一些2個迭代器傳遞給函數。然後,我嘗試用函數distance來計算矢量的大小。在函數內部,我定義了一個新的類型定義,稱爲v_size,但該矢量的<T>類型未知。我如何通過只傳遞迭代器來計算矢量的大小?通過迭代器確定變量類型C++

template<class In, class T> 
     T my_func(In b, In e) 
{ 

typedef typename vector<T>::size_type v_size; 
v_size size = distance(b, e); 
    ... 
    ... 

} 
+0

當你實例化你的函數時,'T'不會是未知的。我不清楚你實際遇到的問題是什麼。請提供[MCVE]。 –

+1

這段代碼很奇怪:如果你知道*'In'是'std :: vector :: iterator',那麼爲什麼你有兩個模板參數呢?如果你不這樣做,那麼你爲什麼使用'std :: vector :: size_type'? – MSalters

回答

1

你可以做三件事情: 通過迭代器的operator*()扣除類型: using v_size = vector<std::remove_reference<decltype(*b)>::type>::size_type;

或使用距離函數的返回類型扣除類型: using v_size = std::decltype(distance(b, e));

或,甚至更好,完全刪除v_size並讓編譯器扣除類型:auto size = std::distance(b, e);

+0

謝謝,弗朗索瓦。回答修正了 – IlBeldus

+1

可能應該是'std :: distance',因爲在通用函數中不能依賴ADL。指針是沒有關聯名稱空間的迭代器。 – MSalters

2

如果你想得到迭代器指向的類型,你可以使用std::iterator_traits。例如

template<class In> 
auto my_func(In b, In e) -> typename std::iterator_traits<In>::value_type 
{ 
    using T = typename std::iterator_traits<In>::value_type; 
    ... 
} 

BTW:我消滅了第二個模板參數T只出現在返回類型聲明,則不能自動推斷。否則,您必須在調用函數時明確指定它。