gpt4 book ai didi

c++ - 为模板化类型确定正确谓词的方法

转载 作者:行者123 更新时间:2023-11-30 04:40:26 25 4
gpt4 key购买 nike

假设我有一个如下所示的函数:

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谓词在比较期间可能会截断值。例如,如果 Inchar*然后std::less<char>即使 In2 也会被调用是一个 int* .

::operator<给定两个参数,编译器能够推断出正确的类型并应用标准类型提升规则。 However, when selecting a predicate to pass to a function, there is no oportunity to have this happen. 是否有一些聪明的方法来找出哪个版本的 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__扩展...,但我也不喜欢这个主意。有什么方法可以以符合标准的方式获得这种净效果?

最佳答案

我好像记得在boost里面有一个关于这个的traits ,但我快速搜索后找不到它。如果你不比我成功,你可以自己构建,

template <typename T1, typename T2>
struct least_common_promotion;

template <>
struct least_common_promotion<short, int>
{
typedef int type;
};

但是您必须指定相当多的明确特化。 type traits boost 库也许可以帮助您减少它们的数量。

编辑:我觉得很愚蠢,操作需要这样的东西(结果类型取决于操作数类型),但谓词不需要(结果类型为 bool)。你可以简单地写:

template <class T1, T2>
struct unhomogenous_less : public std::binary_function<T1, T2, bool>
{
bool operator()(T1 const& l, T2 const& r) const
{ return l < r; }
};

...

typedef typename std::iterator_traits<In>::value_type value_type_1;
typedef typename std::iterator_traits<In2>::value_type value_type_2;
other_func(first, last, first2, unhomogenous_less<value_type_1, value_type_2>());

关于c++ - 为模板化类型确定正确谓词的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com