Bla*_*Cap 4 c++ type-inference
在以下示例中,对于以下调用,类型推断失败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');
Run Code Online (Sandbox Code Playgroud)
问题是mkPair2有两个模板参数,但是调用(2)只提供了其中一个参数,因此编译器立即抛出它并确定程序是不明确的,即使第二种类型可以从下面的('a')调用中推断出来.
这可以通过手动为编译器提供类型来解决mkPair2<int,char> (2) ('a'),但必须保持编译器的手,就像它很快就会变旧.
有没有办法欺骗编译器继续进行类型检查,前提是每种类型最终都会得到解决?
即使第二种类型可以从以下('a')调用中推断出来.
是的,可以推断,但C++的规则不允许这样做.类型推导仅与函数参数一起发生.因此,如果缺少模板参数的函数参数,则需要自己指定.
也就是说,C++ 14的自动返回类型演绎和通用lambdas将使您不必指定任何内容.您可以将代码重写为
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');
Run Code Online (Sandbox Code Playgroud)
一切都将为您推断.它还返回lambda对象,而不是std::function为了避免std::function使用类型擦除的代价.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |