假设我有一个看起来像这样的函数:
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
谓词,可能会在比较期间截断值。例如,即使is an也会调用if In
is char*
then 。std::less<char>
In2
int*
当::operator<
给定两个参数时,编译器能够推断出正确的类型并应用标准类型提升规则。但是,在选择将谓词传递到函数时,没有透明度才能实现这一点。有没有一些聪明的方法可以根据and确定我想通过哪个版本?std::less<>
In
In2
编辑:
下面的例子说明了这个问题:
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
编辑:
想了想,我真正想要的是能够做到这样的事情:
typedef typeof(T1() < T2()) T;
other_func(first, last, first2, std::less<T>());
我想我可以使用 gcc 的__typeof__
扩展...,但我也不喜欢这个想法。有什么方法可以以符合标准的方式获得这种净效果?