我想做这样的事情:
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);
解决方案不一定是模板。如果宏可以实现相同的目标,我很乐意使用宏。有任何建议吗?
答案 0 :(得分:4)
函数的返回类型(即使是模板函数) - 实际上,任何表达式,如果我没有弄错,这就是为什么Gill的答案没有解决任何问题 - 是< strong>编译时属性。你想要的代码是运行时决定。这是一个根本不可解决的冲突(即使是typedef也无法解决这个矛盾, AFAICS)。
可以做的是使用某种句柄或容器。例如,您总是可以返回一个64位整数,在某种意义上,它是较短特化的基本类型(即,您总是可以将一个short int转换为64位int,但不一定反之亦然)。
你也可以编写更复杂的东西(大数字类,多态类,无论如何),但本质是相同的:返回类型将是编译时修复的,类型将能够以某种方式存储所有可能的值,并有一些关于它实际上是什么“类型”的运行时信息(如果所有值都是整数,运行时信息是值本身),并且可能带有强类型转换方法。
答案 1 :(得分:1)
解决方案不一定是模板。如果宏可以实现 同样,我很高兴使用宏。
是的,但这并不比明确告诉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;
}