C++ 我应该创建C++;使用switch语句从变量模板化对象?
我需要创建一个模板类的许多对象。在最终的应用程序中,模板参数将是一个整数变量。因为变量不能用作模板参数,所以我创建了一个C++ 我应该创建C++;使用switch语句从变量模板化对象?,c++,templates,switch-statement,C++,Templates,Switch Statement,我需要创建一个模板类的许多对象。在最终的应用程序中,模板参数将是一个整数变量。因为变量不能用作模板参数,所以我创建了一个switch语句来创建对象 问题是实例化的对象在switch语句的范围之外不可用。在下面的示例中,我多次使用section.tell()来解决这个问题。我宁愿有一条语句,而不是像我已经展示的那样,每个案例都有一条语句 问题: 如何在switch语句的范围之外使用变量 这是解决这个问题的最好办法吗 #包括 模板 班级{ 公众: void tell(){std::cout您正在做的
switch
语句来创建对象
问题是实例化的对象在switch
语句的范围之外不可用。在下面的示例中,我多次使用section.tell()
来解决这个问题。我宁愿有一条语句,而不是像我已经展示的那样,每个案例都有一条语句
问题:
如何在switch
语句的范围之外使用变量
这是解决这个问题的最好办法吗
#包括
模板
班级{
公众:
void tell(){std::cout您正在做的事情在某种程度上接近实际情况
你能做的就是
定义一个接口(抽象类)ISection
,它作为节
模板类的基类
class ISection{
public:
virtual void tell() = 0;
virtual ~ISection(){};
};
template <int i>
class Section : public ISection {
public:
/* tell() is overridden and (in this setting) it is parametrized by i */
void tell(){
/*some thing, e.g.*/
std::cout << "i = " << i << std::endl;
}
};
因此,在开关框架中
std::shared_ptr<ISection> myInstance;
switch (i):
case 1:
myInstance = std::shared_ptr<ISection>(new Section<1>());
break;
case 2:
myInstance = std::shared_ptr<ISection>(new Section<2>());
break;
关于第二个问题,我想说,除非您的模板参数是实际类型(即非静态int
值),否则我不会使用这种模板机制
相反,我只需将int
参数传递给非模板类的构造函数,即
Section mySection(i);
当然,另一方面,您可能想在i
上玩一些阴暗的元编程把戏,您正在做的事情在某种程度上接近实际情况
你能做的就是
定义一个接口(抽象类)ISection
,它作为节
模板类的基类
class ISection{
public:
virtual void tell() = 0;
virtual ~ISection(){};
};
template <int i>
class Section : public ISection {
public:
/* tell() is overridden and (in this setting) it is parametrized by i */
void tell(){
/*some thing, e.g.*/
std::cout << "i = " << i << std::endl;
}
};
因此,在开关框架中
std::shared_ptr<ISection> myInstance;
switch (i):
case 1:
myInstance = std::shared_ptr<ISection>(new Section<1>());
break;
case 2:
myInstance = std::shared_ptr<ISection>(new Section<2>());
break;
关于第二个问题,我想说,除非您的模板参数是实际类型(即非静态int
值),否则我不会使用这种模板机制
相反,我只需将int
参数传递给非模板类的构造函数,即
Section mySection(i);
当然,另一方面,您可能想在i
上玩一些黑暗的元编程把戏,但这可能行不通。您不能使用i
,因为编译时不知道该值,所以这些值无论如何都会硬编码(如switch语句所示)这就是我想知道的。我可以使用<代码>章节<代码>变量吗?以后我需要做什么C++魔术?我给出的基本例子编译和运行很好。它编译得很好,当然,因为这些值是硬编码的(因此在编译时知道)。如果要使用i
作为模板参数,它将不起作用,因为i
是在运行时确定的。换句话说,无法将Section
放在switch语句的范围之外并执行所需操作。相反,只需将Section.tell()
放在每个case语句中即可(如果这些都是琐碎的事情,那么你重复自己的话真的很重要吗?)我想到了一个可怕的黑客行为,它涉及到模板类的非模板基类。但是在我发布这样一个令人厌恶的答案之前,请告诉我们为什么您认为您需要这个。@larsmans我试图避免创建一个节类,然后创建继承自的节1
,节2
等类章节每个都有定制的方法。我正在阅读一些文本文件,并根据文件中的数据创建一些C++对象。上面创建的结构似乎是从文件结构中自然生成的。乐意接受其他建议。这可能不起作用。因为值不知道,不能使用<代码> i>代码>。n在编译时,所以这些值将被硬编码(如开关语句所示)。这就是我想知道的。我可以使用<代码>章节<代码>变量吗?以后我需要做什么C++魔法?我给出的基本示例编译并运行得很好。它编译得很好,因为值是硬编码的。(因此在编译时就知道了。)如果您想使用i
作为模板参数,它将不起作用,因为i
是在运行时确定的。换句话说,没有办法将Section
置于switch语句的范围之外并执行您想要的操作。相反,只需将Section.tell()放入
在每个case语句中(如果它们只是小案例,那么重复自己的话真的重要吗?)我想到了一个可怕的黑客行为,它涉及到模板类的非模板基类。但是在我发布这样一个令人厌恶的答案之前,请告诉我们为什么您认为您需要这个。@larsmans我试图避免创建一个节类,然后创建继承自的节1
,节2
等类每个部分都有定制的方法。我正在阅读一些文本文件,并根据文件中的数据创建一些C++对象。上面创建的结构似乎是从文件的结构中自然生成的。很乐意接受其他建议。你也需要一个虚拟析构函数,在代码< >代码> <代码>。我喜欢这个想法。它使我想知道一个模板是否是解决这个问题的正确实现。你也需要在ISection
上安装一个虚拟析构函数。我喜欢这个想法。这让我想知道一个模板是否是解决这个问题的正确实现。