我是C ++元编程中的菜鸟,我理解我必须将类的实现放在头文件中以实现约定。但是当你想购买一个包时,你需要将标题和实现分开。
现在,有没有办法做到这一点?
注意:我知道'export'关键字并阅读此page!
答案 0 :(得分:3)
不,不是真的。模板必须在编译时可见,因此,如果您的用户要自己实例化模板,则需要定义。
您只需显示实例化您认为需要的模板参数列表组合,并希望您的用户不再需要。
将模板视为可以帮助您进入单个项目的东西。这种固有的限制意味着它们不适合作为“我可以为用户提供我的库以便专门使用他们想要的任何类型”机制。
答案 1 :(得分:2)
有几家供应商提供购买的通用模板(顺便说一句,我假设你想销售模板代码而不是购买它),他们只是发货源。许可协议声明您不能分发或修改代码。完成。
如果这对你的需求不够好,你可以做一些事情:
就个人而言,我不会打扰:从反馈中我回到我的代码似乎尽管文档和解释没有人准备触摸它。我觉得它很可读..,
答案 2 :(得分:1)
不是真的。您可以对代码进行模糊处理,可以将实现分开到impl
文件中并将其包含在标题中,但必须对编译器可见。
但是,如果有一种方法可以限制使用的实际专业化数量,您可以在cpp
文件中移动专门的实现,将声明保留在标题中,它仍然可以工作:
template<typename X>
void foo(X x);
template<>
void foo<int>(int x);
#include "header.h"
template<>
void foo<int>(int x)
{
}
#include "header.h"
foo(1); //works
另外,我认为你不应该担心这一点。因为它们是通用的,我不认为模板可以在它们内部具有那么多重要的逻辑。看看标准的 - vector
,list
- 当然,他们需要花一些时间从头开始写,但那里没有真正的商业秘密。
答案 3 :(得分:1)
templatelib.h
template<typename T> void foo();
templatelib.cpp
#include <iostream>
#include "templatelib.h"
template<typename T> void foo() {
std::cout << typeid(T).name() << '\n';
}
template void foo<int>(); // explicitly instantiate template for this type
的main.cpp
#include "templatelib.h"
int main() {
foo<int>(); // Okay
foo<double>(); // error
}