如何隐藏模板 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
}
在常规 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
}