Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该创建C++;使用switch语句从变量模板化对象?_C++_Templates_Switch Statement - Fatal编程技术网

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
    上安装一个虚拟析构函数。我喜欢这个想法。这让我想知道一个模板是否是解决这个问题的正确实现。