另一个命名空间中模板的不透明对象

时间:2010-02-02 14:57:48

标签: c++ templates pimpl-idiom

我知道如何用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; }

现在,当opaque对象是不同命名空间中的现有类模板而不包含此文件的头文件时,如何执行此操作。以下代码不好,它只是在这里说明我的问题。

// 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在我的项目中到处使用,一般编译需要花费很多时间(每个cpp文件包含my_class.hpp需要5秒)所以我想避免使用opaque_object.hpp,template_class.hpp ...在my_class.hpp。

如何做到这一点?任何评论或想法都是受欢迎的。 提前感谢您的时间。

2 个答案:

答案 0 :(得分:0)

为什么不把它变成模板模板参数(不知道你是否需要更多的参数:)

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

答案 1 :(得分:0)

需要使用正确的命名空间声明每个模板化类以及模板(模板参数)所需的每个类。