编写一个函数,通过判断每个参数的类型来自动确定其返回值

时间:2019-07-20 06:44:04

标签: c++ templates macros

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              |

我想知道是否可以构建这样的程序,以及如何构建。

1 个答案:

答案 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;
}

LIVE