Непрозрачный объект для шаблона в другом пространстве имен - PullRequest
0 голосов
/ 02 февраля 2010

Я знаю, как сделать непрозрачный объект в C ++ следующим образом:

// my_class.hpp
class opaque_object;
class my_class {
    my_class();
    ~my_class();
    opaque_object *m_opaque_object;
};

// my_class.cpp
#include <my_class.hpp>
class opaque_object {
    // ...
};
my_class::my_class() { m_opaque_object = new opaque_object(); }
my_class::~my_class() {delete m_opaque_object; }

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

// my_class.hpp
class third::party::library::opaque_object<
    third::party::library::templated_class>;

class my_class {
    my_class();
    ~my_class();
    third::party::library::opaque_object<
        third::party::library::templated_class> *m_opaque_object;
};

// my_class.cpp
#include <my_class.hpp>
#include <third/party/library/opaque_object.hpp>
#include <third/party/library/template_class.hpp>

typedef third::party::library::opaque_object<
    third::party::library::templated_class> opaque_object;

my_class::my_class() { m_opaque_object = new opaque_object(); }
my_class::~my_class() {delete m_opaque_object; }

Фактический класс моего исходного кода даже более шаблонный, чем этот пример (4 аргумента шаблона, некоторые из которых сами являются шаблонным классом).

Поскольку my_class.hpp используется повсеместно в моем проекте, общая компиляция занимает много времени (5 секунд, чтобы включить my_class.hpp для каждого файла cpp), поэтому я хотел бы избежать включения opaque_object.hpp, template_class.hpp ... в my_class.hpp.

Как это можно сделать? Любые комментарии или идеи сделать это приветствуются. Заранее спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 17 мая 2010

Необходимо объявить каждый шаблонный класс, а также каждый класс, необходимый для шаблона (аргумент шаблона) с правильным пространством имен.

0 голосов
/ 02 февраля 2010

Почему бы не сделать его параметром шаблона-шаблона (не знаю, нужно ли вам там больше параметров:)

template <typename T, template <class> typename opaque>
class my_class
{
...
    opaque<T>* opaque_;
};
...