C++ 从模板创建对象,类型由用户输入c++;

C++ 从模板创建对象,类型由用户输入c++;,c++,class,templates,object,C++,Class,Templates,Object,我有一个类,它是一个模板。我希望程序询问用户他想要什么类型,然后根据他选择的类型实例化一个对象。最好的方法是什么?类似这样的,但不起作用: template <typename T> class Object {...}; cin >> type; Object<type> newobject; 模板类对象{…}; cin>>型; 对象新建对象; 在编译时,C++中的模板必须被解析,所以这里所需要的是不可能用模板来处理的。你最好的办法是在C++中实现.< /

我有一个类,它是一个模板。我希望程序询问用户他想要什么类型,然后根据他选择的类型实例化一个对象。最好的方法是什么?类似这样的,但不起作用:

template <typename T> class Object {...};
cin >> type;
Object<type> newobject;
模板类对象{…};
cin>>型;
对象新建对象;

在编译时,C++中的模板必须被解析,所以这里所需要的是不可能用模板来处理的。你最好的办法是在C++中实现.< /p>模板,必须在编译时解决,所以你想用模板来处理这个问题是不可能的。您的最佳选择可能是实施

它将根据用户输入使对象基于模板和动态:

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;
}
类基
{
公众:
虚~Base(){};
};
样板
类类型:公共基
{
T型;
};
int main()
{
int i;
cin>>i;
基数*b;
开关(一)
{
案例0:b=新类型();中断;
案例1:b=新类型();中断;
案例2:b=新类型();中断;
}
// ...
删除b;
}
它将根据用户输入使对象基于模板和动态:

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;
}
类基
{
公众:
虚~Base(){};
};
样板
类类型:公共基
{
T型;
};
int main()
{
int i;
cin>>i;
基数*b;
开关(一)
{
案例0:b=新类型();中断;
案例1:b=新类型();中断;
案例2:b=新类型();中断;
}
// ...
删除b;
}

至少有两种方法

首先,使用基于用户输入的if/switch语句创建一个实例,然后将该实例存储在不知道特定类型的指针中。它可以是指向抽象基类的指针,也可以是指向生成的包装器的类型擦除指针(如
std::function
所做的),也可以是指向等价于
void
的指针,还可以是一个变量,用于说明以后要使用的类型。在C Java和许多其他语言中都可以实现这种变化


第二种方法是打开用户输入,生成对象,然后继续运行知道模板生成的对象类型的代码。您可以通过复制粘贴、宏或C和其他C派生语言中的代码生成来实现这一点,但这种语言内代码生成在这一谱系中是一种新技术。其他C派生语言中最相似的泛型代码实际上是模糊类型擦除。

至少有两种方法

首先,使用基于用户输入的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;
}
模板类对象{…};
模板void myFunc(){
对象新建对象;
//声明
}
int main(){
cin>>型;
如果(type==“int”)myFunc();
如果(type==“double”)myFunc();
返回0;
}
模板函数 您可以有条件地调用模板函数。这将在编译时生成所有必要的代码以支持所有需要的类型,但仅当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;
}
模板类对象{…};
模板void myFunc(){
对象新建对象;
//声明
}
int main(){
cin>>型;
如果(type==“int”)myFunc();
如果(type==“double”)myFunc();
返回0;
}

C++中不可能,尝试使用动态多态性习语。你将如何处理<代码> NeXObji> <代码>?模板在编译时被填充,所以你不能这样做。您想要多少种可能的类型?它们是如何关联的(继承层次结构?)?我想要3种类型。这3种类型共享了很多方法,但也有不同的方法。在C++中,不可能尝试使用动态多态性成语。你将如何处理<代码> NeXObjs<代码>?模板在编译时被填充,所以你不能这样做。您想要多少种可能的类型?它们是如何关联的(继承层次结构?)?我想要3种类型。这三种类型共享许多方法,但也有不同的方法。