2017-08-30 62 views
2

我想知道这件事:在动态模板中是否有一个干净的包含方法?

比方说,你有一个模板类,要保持动态。因此,你必须在头文件中实现它。

现在说你有几个包含其中通常会在源文件属于,像头文件,例如

#include <algorithm> 
#include <cassert> 
#include <cmath> 
#include <iostream> 

这样做的结果是,每一个时刻,一个包括你的模板类,所有的那些也将包括在内。这让我在这里绊倒 - 这看起来很肮脏。

所以我的问题是,有没有办法做到这一点更好?没有离开动态模板类的概念,那就是。

在SO上,我找到了local #includes,但在那个答案中,答案是关于将包含在源文件中。

+1

我会说,不,一般没有办法。如果你只包含'iostream'来实现一个自定义的流操作符,那么'iosfwd'就可以替代它。但这不是一般的事情。 – StoryTeller

+0

我不认为有一种方法,因为模板必须随时随地产生新类型,并生成该类型所有的声明都需要 – Sopel

+2

我曾经不包含任何头文件,并让我的头文件的用户包括当需要时,必要的标题。尽管我改变了主意,因为包含在你自己的头文件本身改进了本地化,读者可以很容易地看到你的依赖关系。它还使代码更易维护,并且由于丢失包含而导致错误更少,如果您进行更改以更改头文件依赖性。 –

回答

2

不,没有解决方案。

为了便于阅读,我们假设您的模板只有一个模板参数T。现在,如果您的模板使用std::find<std::vector<T>::iterator, T>,则很明显它需要T<algorithm>。这在模板编译的第一阶段已经是这种情况了(请记住,模板通常会被编译两次 - 当它第一次遇到并且被实例化时)

现在看一下您的模板的实例,为T==std::string>。因此,这将需要隐式实例化std::find<std::vector<std::string>::iterator, std::string> - 第二次编译模板。您仍然需要<algorithm>。您还需要std::string,但包括<string>是将std::string>实例化模板的代码的责任。

相关问题