专门用于命名空间的模板

时间:2010-08-24 16:20:24

标签: c++ templates namespaces

假设:

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 个答案:

答案 0 :(得分:4)

您无法在命名空间上进行模板化。如果你能够使用一个类(很可能是公共属性/静态方法),那么你可以在类上模板化为半解决方法。

答案 1 :(得分:1)

不,模板不能在命名空间中进行参数化。

答案 2 :(得分:0)

由于我的知识有限,我相信这个成为一个有用的工具,并且似乎是名称空间和模板之间存在 的关系。 Some people argue然而,它很难实施,而且是不必要的。

在上面的示例中,我将使用结构而不是名称空间(我使用struct而不是class,因为默认情况下它的访问权限是“public”)。下面应该是一个完全可编辑的例子:

#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(),但继承模板是可选的。这篇文章值得一试。它有许多有用和非传统的技巧来使用模板。