2016-10-28 99 views
1

我想要做这样的事情:返回不同的数据类型而无需显式指定数据类型

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

该解决方案并不一定是模板。如果宏可以达到相同的效果,我很乐意使用宏。有什么建议吗?

+1

'foo ()'可能吗? (我的意思是'x'运行时或编译时间的值?) – Jarod42

+0

它是一个运行时间值 – james

+0

不幸的是,您使用它的方式是不可能的。如果'T'也用于参数,那么它会正常工作。 –

回答

4

(甚至一个模板函数)函数的返回值类型—的确,任何表达,如果我没有记错,这是为什么吉尔的答案没有解决任何问题—是一个编译时间属性。你想要的代码是运行时决定。这是一个不能直接解决的根本冲突(即使是typedef也不能解决矛盾,afaics)。

可以做的是使用某种手柄或容器。例如,你总是可以返回一个64位的整数,就某种意义而言,它可以是较短特化的一个基类型(也就是说,你总是可以将一个短整型转换为64位整数,但反之亦然)。你也可以编程一些更复杂的东西(大数类,多态类,不管),但本质将是相同的:返回类型是编译时固定的,类型可以以某种方式存储所有可能的值,并且有一些关于实际是什么“类型”的运行时信息(如果所有值都是整数,运行时信息就是这个值本身),并且可能带有强类型转换方法。

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; 
} 
+1

我认为三元表达式的类型总是'int64_t',我认为这不是OP想要的。与函数一样,表达式的类型在编译时确定,而较小的int被提升。顺便说一句,你应该支配你的宏。 –

+0

@ PeterA.Schneider好点。 –

+0

@ PeterA.Schneider为什么你会说它总是int64_t? –