2017-05-30 89 views
0

C++中是否有任何方法可以在程序中存儲數據類型(如int,char,std :: string等),然後使用該變量代替常規數據類型(例如:聲明其他變量)?可用作數據類型的變量。

對於如: -

T = some-function("int") 
now std::vector <T> is equivalent to std::vector <int> ? 
+0

要在運行時做到這一點需要[*反射*](https://en.wikipedia.org/wiki/Reflection_(computer_programming))C++沒有。一旦源文件被編譯到[*翻譯單元*](https://en.wikipedia.org/wiki/Translation_unit_(編程))中,大部分類型信息就消失了。爲了在編譯時使用* templates *,任何[良好的初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)都應該有幫助。 –

+1

使用模板。如果你想要一個在編譯時不知道的泛型類型,可以使用'std :: variant' – paddy

回答

4

您可以使用模板和decltype
一個最小的,根據您的片斷工作示例:

#include<vector> 

template<typename T> 
T some_function() { return {}; } 

int main() { 
    // t has type int 
    auto t = some_function<int>(); 
    // vec has type std::vector<int> now 
    std::vector<decltype(t)> vec; 
} 
0

可以別名類型(給他們另一個名字)與using關鍵字:

using vi = std:: vector<int>; // I recommend against such short names 
// ... 
vi some_vector_with_integers; 

當然,出現這種情況完全在編譯時。

模板結束語此類聲明允許編譯程序:

template<int N> 
using X = std::conditional<(N > 42), int, double>:: type; 
0

C++是一種靜態類型語言,這意味着類型幾乎沒有在運行時存在。函數返回類型完全由參數類型(const char*)定義,並且不能取決於參數值("int")。

計算流量可能受到類型的影響,通過超載 - 但反之亦然。因此,您不能通過調用某個函數來「計算」某個類型。

相反,您可以在編譯時使用模板/ decltype/auto來生成複雜的和上下文相關的類型,或者使用多態類型。

多態類型確實具有運行時定義的行爲:您可以使some-function返回抽象工廠,然後使用該工廠生成對象 - 在編譯時它們的具體類型將是未知的。當然,你仍然需要用一些靜態類型實例化vector - 通常是指向通用類的指針(AbstractType*)。

您提到int,charstd::string這一事實表明您可能不希望整個多態層次結構可以使用靜態類型進行管理。

Here是一些模板,用於確定調用函數的結果類型。注意該函數甚至沒有被調用 - 同樣,返回類型只依賴於參數類型,而不是一些計算。