gpt4 book ai didi

c++ - 柯里化(Currying)函数的惰性类型推断

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:05 26 4
gpt4 key购买 nike

在下面的例子中,调用 mkPair2 的类型推断失败了:

#include <functional>

template <class A, class B>
struct Pair {
A left; B right;
};

template <class A, class B>
Pair<A,B> mkPair1 (A left, B right) {
return (Pair<A,B>) { left, right };
}

template <class A, class B>
std::function<Pair<A,B>(B)> mkPair2 (A left) {
return [left] (B right) {
return (Pair<A,B>) { left, right };
};
}

Pair<int, char> ex1 = mkPair1 (2, 'a');
Pair<int, char> ex2 = mkPair2 (2) ('a');

问题是 mkPair2有两个模板参数,但是调用 (2)只提供其中一个,所以编译器立即举起手来判定程序有歧义,即使第二种类型可以从以下 ('a') 中推断出来。打电话。

这可以通过手动为编译器提供类型来解决mkPair2<int,char> (2) ('a') ,但必须像那样握住编译器的手很快就会变老。

如果每种类型最终都会被解析,是否有任何方法可以诱使编译器继续进行类型检查?

最佳答案

even though the second type can be inferred from the following ('a') call.

是的,可以推断,但 C++ 的规则不允许这样做。类型推导只发生在函数参数上。因此,如果您缺少模板参数的函数参数,那么您需要自己指定。

也就是说,C++14 的自动返回类型推导和通用 lambda 表达式将使您不必指定任何内容。您可以将代码重写为

template <class A, class B>
struct Pair {
A left; B right;
};

template <class A, class B>
auto mkPair1 (A left, B right) {
return Pair<A,B>{ left, right };
}

template <class A>
auto mkPair2 (A left) {
return [left] (auto right) {
return Pair<A, decltype(right)>{ left, right };
};
}

Pair<int, char> ex1 = mkPair1 (2, 'a');
Pair<int, char> ex2 = mkPair2 (2) ('a');

一切都会为你演绎。它还返回 lambda 对象,而不是 std::function,因此您可以避免 std::function 使用的类型删除的成本。

关于c++ - 柯里化(Currying)函数的惰性类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54561688/

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