2016-10-28 98 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? –