max()
标头中的<algorithm>
函数不支持不同数据类型的两个参数。因此,我尝试使用template
和#if
,#else
和#endif
宏编写自己的代码。到目前为止,我的代码:
#include<iostream>
template <class type1, class type2>
#if sizeof(type1) >= sizeof(type2)
type1 max(type1 a, type2 b){
return (a > b) ? a : b;
}
#else
type2 max(type1, type2){
return (a > b) ? a : b;
}
#endif
int main(){
int a, d; long long b, c;
std::cin >> a >> b;
std::cout << "The max is " << max(a, b) << ".\n";
std::cin >> c >> d;
std::cout << "The max is " << max(c, d) << ".\n";
return 0;
}
现在显然代码是无效的,因为它引发了语法错误(也许因为我是本主题以及模板的新手,所以我误解了这些宏的工作方式):
|Line 05 | error: missing binary operator before token "type1" |
| | In function 'type2 max(type1, type2)': |
|Line 11 | error: 'a' was not declared in this scope |
|Line 11 | error: 'b' was not declared in this scope |
我想知道是否可以构建这样的程序,以及如何构建。
答案 0 :(得分:4)
您不能将宏与此类模板混合使用;宏将首先进行评估,并且不会与您期望的模板进行交互。
您可以使用std::conditional
显式声明返回类型,
// if sizeof(type1) >= sizeof(type2), then declare the return type as type1
// otherwise type2
template <class type1, class type2>
std::conditional_t<sizeof(type1) >= sizeof(type2), type1, type2>
max(type1 a, type2 b) {
return (a > b) ? a : b;
}
或者您可以只使用auto
。返回类型将自动推导为conditional operator确定的通用类型。对于max(int, long long)
和max(long long, int)
,返回类型将为long long
,与上述版本相同。 (请注意,常见类型可能与上述版本不同;例如,对于max(short, bool)
,返回类型将是int
而不是short
。)
template <class type1, class type2>
auto max(type1 a, type2 b) {
return (a > b) ? a : b;
}