簡體   English   中英

從模板創建對象,類型由用戶輸入c ++輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM