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

时间:2016-10-28 10:06:09

标签: c++ c++11 templates

我想做这样的事情:

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);

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

2 个答案:

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