假設我有一個功能,它看起來像這樣:的方式來確定適當的謂詞模板類型
template <class In, class In2>
void func(In first, In last, In2 first2);
我想這個函數來調用它接受一個斷言其他功能。我最初的本能是做這樣的事情:
template <class In, class In2>
void func(In first, In last, In2 first2) {
typedef typename std::iterator_traits<In>::value_type T;
other_func(first, last, first2, std::less<T>());
}
但是還有一個問題,如果In
和In2
是迭代器不同類型的?例如,char*
與int*
。取決於哪個是In
而哪個是In2
,謂詞可以在其比較期間截斷值。例如,如果In
是char*
,那麼即使In2
是int*
,也會調用std::less<char>
。
當::operator<
有兩個參數時,編譯器能夠推導出正確的類型,並且適用標準類型提升規則。然而,當選擇一個謂詞傳遞給函數時,沒有機會發生這種情況。 是否有一些巧妙的方法可以根據In
和In2
找出我想要傳遞std::less<>
的哪個版本?
編輯:
下面的例子說明了這個問題:
unsigned int x = 0x80000000;
unsigned char y = 1;
std::cout << std::less<unsigned char>()(x, y) << std::endl;
std::cout << std::less<unsigned int>()(x, y) << std::endl;
將輸出:
1
0
EDIT:
考慮這件事後,我真的想是要能夠做這樣的事情:
typedef typeof(T1() < T2()) T;
other_func(first, last, first2, std::less<T>());
我想我可以使用gcc的__typeof__
擴展......,但是我不喜歡這個想法無論是。任何方式以標準一致的方式獲得淨效應?
是的,到目前爲止,非均勻少模板似乎是解決方案。實際上,我想知道爲什麼'std :: less'(或者所有的binary_function比較器)不能取2個模板參數。似乎這是在所有情況下使'std :: less'的行爲類似於operator <的唯一方法。 – 2009-08-31 15:19:30