如何在C ++中使用模板创建商业库?

时间:2012-03-15 18:15:53

标签: c++ template-meta-programming

我是C ++元编程中的菜鸟,我理解我必须将类的实现放在头文件中以实现约定。但是当你想购买一个包时,你需要将标题和实现分开。

现在,有没有办法做到这一点?

注意:我知道'export'关键字并阅读此page

4 个答案:

答案 0 :(得分:3)

不,不是真的。模板必须在编译时可见,因此,如果您的用户要自己实例化模板,则需要定义。

您只需显示实例化您认为需要的模板参数列表组合,并希望您的用户不再需要。

将模板视为可以帮助您进入单个项目的东西。这种固有的限制意味着它们不适合作为“我可以为用户提供我的库以便专门使用他们想要的任何类型”机制。

答案 1 :(得分:2)

有几家供应商提供购买的通用模板(顺便说一句,我假设你想销售模板代码而不是购买它),他们只是发货源。许可协议声明您不能分发或修改代码。完成。

如果这对你的需求不够好,你可以做一些事情:

  • 将代码分解为对模板参数的依赖性最小的组件。这可能会产生部分代码,您可以将它们放入一个易于编译的对象中,因为它们不依赖于模板参数,或者您可以预先实例化代码。
  • 模糊代码可能是一种方法。在这种情况下,值得注意的是,史蒂夫·克拉迈特(Steve Clamage)对“混淆的C ++竞赛”缺席的理由是:“这就像在枪管里射鱼一样。”
  • 创建一个服务,客户上传模板实例化所需的类声明并返回已编译的实例。当然,如果您不信任客户,他们没有理由认为您可能值得信赖。
  • 等待标准的下一版本,希望有某种模块支持帮助解决此问题。不过,我不会打赌这么高。

就个人而言,我不会打扰:从反馈中我回到我的代码似乎尽管文档和解释没有人准备触摸它。我觉得它很可读..,

答案 2 :(得分:1)

不是真的。您可以对代码进行模糊处理,可以将实现分开到impl文件中并将其包含在标题中,但必须对编译器可见。

但是,如果有一种方法可以限制使用的实际专业化数量,您可以在cpp文件中移动专门的实现,将声明保留在标题中,它仍然可以工作:

header.h

template<typename X>
void foo(X x);

template<>
void foo<int>(int x);

impl1.cpp

#include "header.h"

template<>
void foo<int>(int x)
{
}

impl2.cpp

#include "header.h"

foo(1); //works

另外,我认为你不应该担心这一点。因为它们是通用的,我不认为模板可以在它们内部具有那么多重要的逻辑。看看标准的 - vectorlist - 当然,他们需要花一些时间从头开始写,但那里没有真正的商业秘密。

答案 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
}