代码之家  ›  专栏  ›  技术社区  ›  BCS

命名空间上专用的模板

  •  5
  • BCS  · 技术社区  · 14 年前

    鉴于:

    namespace A {
      class Foo;
      class Bar;
    }
    
    namespace B {
      class Foo;
      class Bar;
    }
    

    我想在命名空间a或B上创建一个类的模板,以使以下功能正常工作:

    template<name> class C {
      name::Foo* foo;
      name::Bar* bar;
    }
    

    这可以直接完成,还是需要创建一对包含typedef的结构类型?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Mark B    14 年前

    不能在命名空间上创建模板。如果您能够使用一个类(最有可能使用公共属性/静态方法),那么您可以在该类上使用模板作为半解决方案。

        2
  •  1
  •   Dr. Snoopy    14 年前

    不,模板不能在命名空间上参数化。

        3
  •  0
  •   Clint Chelak    6 年前

    以我有限的知识,我相信 是一个有用的工具,似乎是一种关系 能够 存在于命名空间和模板之间。 Some people argue

    在上面的例子中,我将使用结构而不是名称空间(我使用 struct 结束 class

    #include <iostream>
    
    // Replaces namepace 'A' from above.
    templates
    struct Option1 {
    
        class Foo;
    
        //Example function, too.
        void myFunc() {
            std::cout << "Hello!\n";
        }
    };
    
    // A second Option for example.
    struct Option2 {
        class Foo;
    
        void myFunc() {
            std::cout << "Hola!!\n";
        }
    };
    
    // Can be in .cpp file
    class Option1::Foo {
    public:
        Foo() { display(); }
    
        void display() {
           std::cout << "Option 1.\n";
        }
    };
    
    class Option2::Foo {
    public:
        Foo() { display(); }
    
        void display() {
            std::cout << "Option 2.\n";
        }
    };
    

    // The typename C would need class 'Foo' 
    template <typename C>
    class OptionSelect : public C
    {
        typename C::Foo* foo;
    
        public:
        OptionSelect() {
            foo = new typename C::Foo();
        }
    
    };
    
    int main() {
        OptionSelect<Option1> opt1;
        OptionSelect<Option2> opt2;
    
        opt1.myFunc();  // Provided that template had myFunc
        opt2.myFunc();         
    
        return 0;
    }
    

    建造时的结果如下:

    Option 1.
    Option 2.
    Hello!
    Hola!!
    

    我想到了从 here ,尽管我承认没有定义 myFunc()