是否可以編寫一個接受一個類型並返回(相關)類型的函數。例如,一個函數採用名爲「RandomVariable」的類型並返回一個名爲「RandomVariableCovariance」的類型。我猜一般問題是typenames是否可以是參數或返回類型。 C++ 0x很好。能寫一個函數,它需要一個類型並返回一個不同的類型
回答
你不能用功能做到這一點,但你可以用模板特做。例如
template <class T>
struct ConvertType;
template <>
struct ConvertType<RandomVariable>
{
typedef RandomVariableCovariance type;
};
int main()
{
ConvertType<RandomVariable>::type myVar;
}
定義類型ConvertType
這是專門爲將從RandomVariable
到RandomVariableCovariance
。根據您的需要,可以通過這種方式進行各種巧妙的類型選擇。
我完全忽略了你的答案...:P +1。 – Xeo
類型名稱不能是參數或函數的返回值;類型是編譯時的事情!
這是C++ 0x;它可能在那裏 –
@Nicol:C++ 0x超出了我所知!如果你寫了一個描述這個的答案,那麼我將刪除我的... –
@Nicol:你的答案不是在運行時操縱類型(或類型名),這是OP的問題意味着什麼...... –
原諒我糟糕C,因爲它已經永遠,因爲我實際上它的工作:
typedef int RandomVariable;
typedef float RandomVariableCovariance;
RandomVariableCovariance myFunc(RandomVariable x) {
....
}
我認爲這是錯過了一點;我對OP的問題的解釋是希望實際返回一個類型;即在運行時操作類型! –
哦。所以基本上就像c中的「變量變量」一樣?嚇人......非常非常非常可怕。 –
這就是我閱讀OP的問題的方法。如果不是的話,那他就非常不清楚了! –
這是C++ 0x的長列表。這就是爲什麼他們創造了這個奇怪的函數定義格式:
auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...}
它與decltype相結合,讓你做這樣的事情:
auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...}
這意味着,返回類型將是你得到什麼的時候你可以調用operator +(Type1,Type2)。
請注意,C++是一種靜態類型的語言。你不能在運行時輸入計算。它必須在編譯時通過像這樣的機制或某種形式的模板元編程來完成。
雖然這仍然是**編譯時**代碼生成功能,所以它並不是真正的「將類型作爲參數」。 –
你只能在編譯時進行類型計算。所有模板元編程和基於類型的計算都由編譯器完成。 C++是一種_statically_ typed語言;運行時輸入是不可能的。 –
是的,當然,我只是想確保OP知道這一點。乾杯。 –
- 1. 功能這一般需要一個類型並返回相同類型
- 2. 如何寫一個函數返回一個返回類型的子函數
- 3. Java泛型:類,需要一個類,它另一個類
- 4. 來自同一函數的多個不同的返回類型
- 5. C++類函數的返回類型定義,返回一個類
- 6. 重構一個返回不同數據類型的函數
- 7. 函數返回一個不同的數據類型
- 8. 它使返回類型錯誤:一個浮動需要
- 9. F#:從一個函數返回不同類型的值
- 10. 重寫返回一個泛型類
- 11. 一個泛型類型參數,返回類型不同的泛型?
- 12. 如何讓一個函數返回不同類型
- 13. 將不同的數據類型合併爲一個空類型
- 14. 類型錯誤:一個整數需要
- 15. 預測不同類型的數據集,而不需要一個
- 16. 爲什麼我不能通過它的返回類型重載一個函數?
- 17. C#屬性 - 返回一個類型並存儲另一個類型
- 18. C++如何從一個函數返回不同類型的多個數組
- 19. 功能的參數並返回一個對象類型
- 20. 爲什麼「Foo f(Bar());」可以是一個函數的聲明,需要Bar類型並返回Foo類型?
- 21. Postgresql C函數需要一個FLOAT8 []並返回一個INT []?
- 22. 創建一個函數返回類的類型
- 23. C++ - 類類型的構造函數返回一個左值?
- 24. 函數返回另一個類的類型變量
- 25. Java:使用一個函數返回幾個不同類型的值
- 26. 從函數返回一個通用函數類型的值
- 27. 下標返回自我類型和不需要重寫它在每個子類
- 28. 返回一個ReadOnlyCollection從方法與一個IList返回類型
- 29. 函數的返回類型的需要
- 30. 流星類型錯誤:需要(...)addStyles不是一個函數
說出你想要解決的問題,也許我們可以找到一個好的設計理念。 –
你應該澄清一下:你是否想要一個*操作類型的函數*(也就是*類型*'RandomVariable'的參數並返回類型'RandomVariableCovariance')或某種類型的模板函數來決定它的返回類型其論點之一? –
對於一個隨機變量,其平均值與其實現的類型相同(因此在類中將接口編寫爲基礎類型作爲模板參數很容易),但其協方差是不同的類型(這是相關的但是以不平凡的方式)。如果隨機變量是一個N元素向量(比如一個ublas向量類型),那麼該隨機變量的協方差就是一個N×N元素矩陣(比如一個ublas矩陣類型)。我不想讓這個類明確地指定它的協方差的類型,但是能夠從它的實現中推斷出它。如果有幫助,我可以發佈示例代碼。 – bpw1621