返回不同的数据类型,而无需显式指定数据类型

return different data type without explicitly specify data type

本文关键字:数据类型 返回      更新时间:2023-10-16

我想这样做:

template<class T>
T foo(uint8_t x)
{
    if (x<32) return ((int32_t)1<<x);
    else return ((int64_t)1<<x);
}

,但我不想调用foo<int32_t>(x)foo<int64_t>(x)。它看起来不太好看。我希望返回类型能被自动正确地推导出来。

预期用法示例:

std::max(foo(10),some_variable); // return type of foo need to match some_variable
std::min(foo(32),another_variable);

解决方案不一定是模板。如果宏可以实现相同的功能,我很乐意使用宏。有什么建议吗?

函数(甚至是模板函数)的返回类型—事实上,任何表达式,如果我没弄错的话,这就是为什么Gill的答案解决不了任何问题—是一个编译时属性。你想在你的代码是一个运行时决策。这是一个根本的冲突,不能直接解决(即使是类型定义也不能解决这个矛盾)。

可以做的是使用某种句柄或容器。例如,你总是可以返回一个64位整数,从某种意义上说,它是较短专门化的基类型(也就是说,你总是可以将短int型转换为64位int型,但不一定反之亦然)。

您还可以编写更复杂的程序(大num类、多态类等),但本质是相同的:返回类型将是编译时固定的,并且该类型将能够以某种方式存储所有可能的值,并具有关于它实际是什么"类型"的一些运行时信息(如果所有值都是整数,则运行时信息就是值本身),并且可能带有强类型转换方法。

解决方案不一定是模板。如果宏可以实现同样,我很乐意使用宏。

是的,但这并不比显式地告诉Foo你想要什么模板类型更干净。

无论如何,这是可以做到的,但它不是很漂亮:

#include <iostream>
#include <stdint.h>
#define FOO(x) (x < 32 ? Foo_32(x) : Foo_64(x)) 
int32_t Foo_32(uint8_t x)
{
    std::cout << "32n";
    return (int32_t)1<<x;
}
int64_t Foo_64(uint8_t x)
{
    std::cout << "64n";
    return (int64_t)1<<x;
}
int main() {
    FOO(35);
    FOO(22);
    return 0;
}