【发布时间】:2009-08-30 02:51:05
【问题描述】:
假设我有一个如下所示的函数:
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< 被赋予两个参数时,编译器能够推断出正确的类型并应用标准类型提升规则。 However, when selecting a predicate to pass to a function, there is no oportunity to have this happen. 有没有一些聪明的方法可以根据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
编辑:
想了想,我真正想要的是能够做到这样的事情:
typedef typeof(T1() < T2()) T;
other_func(first, last, first2, std::less<T>());
我想我可以使用 gcc 的 __typeof__ 扩展...,但我也不喜欢这个想法。有什么方法可以以符合标准的方式获得这种净效果?
【问题讨论】: