return 不同的数据类型,没有明确指定数据类型

return different data type without explicitly specify data type

我想做这样的事情:

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)。它看起来 nice.I 不希望自动正确推导 return 类型。

预期用法示例:

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

解决方案不必是模板。如果宏也能达到同样的效果,我很乐意使用宏。有什么建议吗?

The solution does not have to be template. If macros can achieve the same, I'm happy to use macros.

是的,但这并没有比明确告诉 Foo 你想要什么模板类型更干净。

总之,这个 can be done 但它并不漂亮:

#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 << "32\n";
    return (int32_t)1<<x;
}

int64_t Foo_64(uint8_t x)
{
    std::cout << "64\n";
    return (int64_t)1<<x;
}

int main() {
    FOO(35);
    FOO(22);
    return 0;
}

函数的 return 类型(甚至是模板函数)——事实上,任何 表达式 ,如果我没记错的话,这就是为什么 Gill 的回答没有解决任何问题 — 是一个 编译时间属性。 您在代码中想要的是一个 运行 时间决定。 这是无法直接解决的根本冲突(即使是 typedef 也无法解决矛盾,afaics)。

可以做的是使用某种句柄或容器。例如,您总是可以只 return 一个 64 位整数,从某种意义上说,它是较短特化的基本类型(即,您总是可以将 short int 转换为 64 位 int,但不一定反之亦然).

你也可以编写更复杂的程序(大数 class、多态 class,随便什么),但本质是一样的:return 类型是编译型的时间是固定的,并且该类型能够以某种方式存储所有可能的值,并且有一些 运行 时间的信息关于 "type" 它实际上是什么(如果所有值都是整数, 运行时间信息本身就是值),并且可能带有强类型转换方法。