[英]Create objects from template, type is entered by user input c++
我有一類是模板。 我希望程序詢問用戶他想要什么類型,然后根據他選擇的類型實例化一個對象。 最好的方法是什么? 像這樣的東西,但是不起作用:
template <typename T> class Object {...};
cin >> type;
Object<type> newobject;
它將使對象模板基於用戶輸入而動態化:
class Base
{
public:
virtual ~Base() {};
};
template <typename T>
class Type : public Base
{
T type;
};
int main()
{
int i;
cin >> i;
Base *b;
switch (i)
{
case 0: b = new Type<float>(); break;
case 1: b = new Type<int>(); break;
case 2: b = new Type<char>(); break;
}
// ...
delete b;
}
C ++中的模板必須在編譯時解析,因此此處所需的功能與模板無關。 最好的選擇可能是實現Factory方法模式 。
至少有兩種方法。
首先,根據用戶輸入使用if / switch語句創建一個實例,然后將該實例存儲在不知道特定類型是什么的指針中。 它可以是指向抽象基類的指針,也可以是指向已生成的包裝器的類型已擦除指針(例如std::function
所做的事情),也可以是指向void
和等效變量的指針,以聲明要使用的類型后來。 可以使用C Java和許多其他語言來進行此更改。
第二種方法是打開用戶輸入,生成對象,然后繼續運行知道模板生成的對象類型的代碼。 您可以使用C和其他C派生語言中的復制粘貼或宏或代碼生成來執行此操作,但是這種語言代碼生成是該世系中的一種新技術。 其他C派生語言中最相似的通用代碼實際上是模糊的類型擦除。
您可以有條件地調用模板函數。 這將在編譯時生成所有必需的代碼以支持所有必需的類型,但是僅當if語句調用該代碼時才使用那些代碼。 然后,當您需要在函數中引用用戶輸入的類型時,可以使用“ T”。
template <typename T> class Object {...};
template <typename T> void myFunc() {
Object<T> newobject;
//statements
}
int main() {
cin >> type;
if (type == "int") myFunc<int>();
if (type == "double") myFunc<double>();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.