шаблон специализируется на пространстве имен - PullRequest
5 голосов
/ 24 августа 2010

Дано:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}

Я хочу создать шаблон класса в пространстве имен A или B таким образом, чтобы выполнялось следующее:

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

Можно ли это сделать напрямую или мне нужносоздать пару типов структур с typedefs в них?

Ответы [ 3 ]

4 голосов
/ 24 августа 2010

Вы не можете шаблон в пространстве имен. Если вы можете использовать класс (с наиболее вероятными общедоступными атрибутами / статическими методами), вы можете использовать шаблон в качестве полуобходного решения.

1 голос
/ 24 августа 2010

Нет, шаблоны не могут быть параметризованы в пространстве имен.

0 голосов
/ 27 мая 2018

С моим ограниченным знанием я считаю, что этот будет полезным инструментом, и, похоже, это отношение, которое может существовать между пространствами имен и шаблонами. Некоторые люди утверждают, , что это было бы трудно реализовать и, тем не менее, не нужно.

В приведенном выше примере я бы использовал структуры, а не пространства имен (я использую 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!!

У меня появилась идея наследовать класс шаблона от здесь , хотя я признаю, что без определения myFunc(), как я это сделал, наследование шаблона будет необязательным.Статья стоит проверить.В нем есть много полезных и нетрадиционных приемов использования шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...