模板化的pimpl转发

时间:2012-04-06 17:01:45

标签: c++ templates pimpl-idiom

我在一种模板化的层次结构中有一堆相关的指标,看起来像

template <int level>
struct index{
    index<level - 1> w;
    int x, y;
};

template <> struct index<0> { int x, y; };

template <int level>
struct data;

和一个应该生成并缓存由它们索引的对象的类。我想在这个类中使用pimpl,我想知道是否有办法使用模板将函数调用转发给实现类。像

这样的东西
class Cache{
    template <int level>
    shared_ptr<data<level>> get_data(const index<level> & index);
};  

1 个答案:

答案 0 :(得分:1)

简而言之,不(如果我理解你的问题)。

问题在于,在实现转发器时,您需要实现类的完整定义(而不仅仅是声明)。如果要为此目的使用模板成员函数,则需要在使用它们的每个编译单元中定义它们,即通常在声明它们的同一个头中。这意味着实现类需要在您声明接口类的同一个头文件中定义(这将首先破坏了对类进行欺骗的目的)。

(如果您的编译器支持export关键字,您可以单独定义模板方法,因此在这种情况下它可以工作。实际上,Comeau是我知道的唯一支持export的编译器,它已完全从C ++ 11中删除。

比较C ++中的How can I avoid linker errors with my template functions? - FAQ-lite。