如何隐藏模板 class 实现的依赖关系?

How to hide dependencies of implementation of template class?

在常规 C++ classes 中,我们可以有一个 class A 如下:

在A.h中:

class A {
    public:
        void method();
    // rest of class declaration
};

在A.cpp中:

#include "A.h"
#include "implementation_dependencies.h"

void A::method(){
    // use dependencies to implement method
}

但是如果 A 是模板 class,这是不可能的。我们如何仍然使用 C++ 模板实现信息隐藏 classes?

在 C++11 中使用 extern 模板(或具有相同效果的 C++11 之前的全局函数)被证明对此很有用,但是当需要模板 class 时该怎么办适用于所有类型?

例如智能指针:我不能将 class 的定义放在 A.h 中,因为那样会将“implementation_dependencies.h”暴露给包括“[=25]在内的任何人=]".

从 c++20 开始,您可以使用模块执行此操作:

// A.cpp
export module A;

export 
 template <typename>
 class A {
  // ...
};

#include "implementation_dependencies.h"

export template <typename T>
void A<T>::method() {
  // use dependencies, but don't export them from this module
}