2011-07-04 27 views
5

是否可以編寫一個接受一個類型並返回(相關)類型的函數。例如,一個函數採用名爲「RandomVariable」的類型並返回一個名爲「RandomVariableCovariance」的類型。我猜一般問題是typenames是否可以是參數或返回類型。 C++ 0x很好。能寫一個函數,它需要一個類型並返回一個不同的類型

+3

說出你想要解決的問題,也許我們可以找到一個好的設計理念。 –

+0

你應該澄清一下:你是否想要一個*操作類型的函數*(也就是*類型*'RandomVariable'的參數並返回類型'RandomVariableCovariance')或某種類型的模板函數來決定它的返回類型其論點之一? –

+0

對於一個隨機變量,其平均值與其實現的類型相同(因此在類中將接口編寫爲基礎類型作爲模板參數很容易),但其協方差是不同的類型(這是相關的但是以不平凡的方式)。如果隨機變量是一個N元素向量(比如一個ublas向量類型),那麼該隨機變量的協方差就是一個N×N元素矩陣(比如一個ublas矩陣類型)。我不想讓這個類明確地指定它的協方差的類型,但是能夠從它的實現中推斷出它。如果有幫助,我可以發佈示例代碼。 – bpw1621

回答

11

你不能用功能做到這一點,但你可以用模板特做。例如

template <class T> 
struct ConvertType; 

template <> 
struct ConvertType<RandomVariable> 
{ 
    typedef RandomVariableCovariance type; 
}; 

int main() 
{ 
    ConvertType<RandomVariable>::type myVar; 
} 

定義類型ConvertType這是專門爲將從RandomVariableRandomVariableCovariance。根據您的需要,可以通過這種方式進行各種巧妙的類型選擇。

+0

我完全忽略了你的答案...:P +1。 – Xeo

2

類型名稱不能是參數或函數的返回值;類型是編譯時的事情!

+0

這是C++ 0x;它可能在那裏 –

+0

@Nicol:C++ 0x超出了我所知!如果你寫了一個描述這個的答案,那麼我將刪除我的... –

+0

@Nicol:你的答案不是在運行時操縱類型(或類型名),這是OP的問題意味着什麼...... –

-2

原諒我糟糕C,因爲它已經永遠,因爲我實際上它的工作:

typedef int RandomVariable; 
typedef float RandomVariableCovariance; 

RandomVariableCovariance myFunc(RandomVariable x) { 
    .... 
} 
+0

我認爲這是錯過了一點;我對OP的問題的解釋是希望實際返回一個類型;即在運行時操作類型! –

+0

哦。所以基本上就像c中的「變量變量」一樣?嚇人......非常非常非常可怕。 –

+0

這就是我閱讀OP的問題的方法。如果不是的話,那他就非常不清楚了! –

0

這是C++ 0x的長列表。這就是爲什麼他們創造了這個奇怪的函數定義格式:

auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...} 

它與decltype相結合,讓你做這樣的事情:

auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...} 

這意味着,返回類型將是你得到什麼的時候你可以調用operator +(Type1,Type2)。

請注意,C++是一種靜態類型的語言。你不能在運行時輸入計算。它必須在編譯時通過像這樣的機制或某種形式的模板元編程來完成。

+0

雖然這仍然是**編譯時**代碼生成功能,所以它並不是真正的「將類型作爲參數」。 –

+2

你只能在編譯時進行類型計算。所有模板元編程和基於類型的計算都由編譯器完成。 C++是一種_statically_ typed語言;運行時輸入是不可能的。 –

+1

是的,當然,我只是想確保OP知道這一點。乾杯。 –

相關問題