我在一种模板化的层次结构中有一堆相关的指标,看起来像
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);
};
答案 0 :(得分:1)
简而言之,不(如果我理解你的问题)。
问题在于,在实现转发器时,您需要实现类的完整定义(而不仅仅是声明)。如果要为此目的使用模板成员函数,则需要在使用它们的每个编译单元中定义它们,即通常在声明它们的同一个头中。这意味着实现类需要在您声明接口类的同一个头文件中定义(这将首先破坏了对类进行欺骗的目的)。
(如果您的编译器支持export
关键字,您可以单独定义模板方法,因此在这种情况下它可以工作。实际上,Comeau是我知道的唯一支持export
的编译器,它已完全从C ++ 11中删除。
比较C ++中的How can I avoid linker errors with my template functions? - FAQ-lite。