【发布时间】:2014-10-17 19:03:58
【问题描述】:
当我编写一个类 toString 的通用模板类时,我遇到了一个难题,它给出了一个代表我使用的常见数据结构的 QString。我希望我可以在此头文件 (#include in .h or .c / .cpp?) 中包含最少数量的其他头文件,但也希望它不依赖于包含的顺序 (Header file order)。
基本代码是这样的:
// Some headers
template <typename T>
class PMsg
{
// Public routines
public:
static QString fromType();
static QString fromValue(T const &val);
}; // PMsg
// Inline definition of all methods in PMsg<T>::fromValue
// Some specialisation
// To be continued...
问题来了:容器类。我是否应该执行以下操作来拉动所有容器标头以使其工作:
// To the beginning
#include <QtCore/QList>
#include <QtCore/QVector>
// After PMsg<T>
template <typename T>
class PMsg<QList<T> >
{
// Public routines
public:
static QString fromType();
static QString fromValue(QList<T> const &val);
}; // PMsg
// Some definitions
template <typename T>
class PMsg<QVector<T> >
{
// Public routines
public:
static QString fromType();
static QString fromValue(QVector<T> const &val);
}; // PMsg
// Some definitions
或者使用宏来检测包含哪些标头:
#if defined(QLIST_H)
template <typename T>
class PMsg<QList<T> >
{
// Public routines
public:
static QString fromType();
static QString fromValue(QList<T> const &val);
}; // PMsg
// Some definitions
#endif
#if defined(QVECTOR_H)
template <typename T>
class PMsg<QVector<T> >
{
// Public routines
public:
static QString fromType();
static QString fromValue(QVector<T> const &val);
}; // PMsg
// Some definitions
#endif
我最终可能会包含 20 多个不同的标头(包括一些非 Qt 类,例如 Eigen 中的类),或者我可能会依赖 Qt 可以更改的东西,而无需告诉下游开发人员并要求我的同事在此标头之前包含 Qt 标头当然。
我也不确定此时两种方式对编译时间的影响有多大(如果我没有解决这个问题,可能不应该考虑)。
有没有其他更好的方法来解决这个问题或者我应该遵循哪种方法?
抱歉问题标题不好,感谢您的帮助。
【问题讨论】:
-
库提供者负责在其标头中包含保护;不是你。包括编译成功所需的内容。您不能(也不应该)假设第 3 方库的 include-guard 宏的名称,更不用说在 您的代码 中对它们进行硬编码了。而 none 是编译时的;它是管理这些的 preprocessor 步骤,并且如果由包含的头文件正确实现,将对您的最终编译时间产生近乎零的影响。只需包含第一个示例中的标题即可。让他们的 include-guards 和预处理器来解决它。
-
您的第二个链接问题是第一个答案的问题的副本,该问题列出了通常用来帮助整理不正确的依赖假设的口头禅。 See this answer.
-
只要未定义主模板(非专业化),您可能需要考虑为每个专业化单独的头文件。
-
@WhozCraig,感谢您的帮助。我同意你的观点,我永远不应该依赖我无法控制的东西。在发布此问题之前,我阅读了该答案。它没有解决但您解决的问题之一是是否适合依赖警卫检测和包含顺序,我的程序实际上可以使用它。
-
@VaughnCato,
我想我需要提供更多信息。我们有一个名为 PLogger 的下游类,它使用模板方法调用 PMsg::fromValue() 并写下消息。如果我做对了,我需要该类中包含的所有专业化,这是 PMsg 类的主要用法。我怀疑分离专业是否会有所帮助。
标签: c++ qt header-files