C ++模板解决方法

时间:2010-10-13 05:28:57

标签: c++ templates

在我的C ++项目中,我最近偶然发现了一个小问题:模板。

我在我的头文件(由每个.cpp共享)中声明了一个类Data,并为它提供了一个模板函数。我在data.cpp中实现了它。我很快就记得模板是如何在现场编译的,当它们被引用时,这会打破使用.h和.cpp文件完成的声明/实现分离。

所以我想通过以下方式做一些工作:

class Data {
  template<typename T> void myFunc(T in);
};

#define __DATA_TEMPLATE_IMPL
#include "Data.cpp"
#undef __DATA_TEMPLATE_IMPL

在header.h中:

#ifndef __DATA_TEMPLATE_IMPL

// non-template functions and other stuff....

#else

template<typename T>
void Data::myFunc(T in) {
  // implementation of template function
}

#endif

这是一个很大的解决方法,对于编译器来说,好像#else#endif之间的代码移动到头文件中。

两个问题:

你觉得这有什么问题吗?你能想出任何可能是错误的,不合适的或其他什么原因吗?

有没有更好的方法(除了实际将实现放在头文件中)?

2 个答案:

答案 0 :(得分:2)

  

你觉得这有什么问题吗?   你能想到这可能有什么原因吗?   是错的,不合适的还是其他什么?

  • 您的构建工具将是:

    • 如此愚蠢/手动,他们没有意识到实施文件发生变化时需要重新编译客户端代码,或者
    • 足够聪明,所以......
      • 更改了客户端代码通常会脱离的实现文件部分 - 行外函数,私有实现等 - 现在触发重新编译客户端代码。这种解耦是首先使用头文件与实现文件的主要原因。对于企业级构建中的低级代码而言,妥协它是不可接受的。
  • 对于其他开发人员来说,在他们理解您的代码之前必须先发现这一点。

  

有没有更好的方法(除了实际将实现放在头文件中)?

更好的方式是什么?你想解决一个实际问题吗?如果是这样,可能有很多方法可以解决它。如果你的问题只是对不雅的挫败感,那就继续......生命太短暂。

答案 1 :(得分:1)

这在技术上没有任何错误,编译器不会在乎。然而,将模板代码粘贴在头文件中是很常见的,也就是说,没有令人信服的理由将其放在CPP文件中。

关于“所有功能”是模板功能的评论。这是低效率可能开始显示的地方,也就是你怀疑的那种。我知道大多数编译器编译模板比普通代码慢。此外,由于所有内容都在标题中,因此每个源单元都有更多要解析的代码,从而进一步降低了速度。我不是说不使用模板,但要注意它们没有编译时间。