gpt4 book ai didi

c++ - 我应该在模板类头文件中包含我需要的一切吗?

转载 作者:行者123 更新时间:2023-11-30 04:01:56 25 4
gpt4 key购买 nike

当我编写一个类似 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...

问题来了:容器类。我是否应该执行以下操作来拉取所有容器 header 以使其工作:

// 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

或者使用宏来检测包含哪些 header :

#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 头文件当然。

我也不确定此时这两种方式对编译时间的影响有多大(如果我没有解决这个问题,可能不应该考虑)。

有没有其他更好的方法来解决这个问题,或者我应该遵循哪种方法?

抱歉问题标题不好,感谢您的帮助。

最佳答案

根据您的描述,您正在提供一个带有自定义点 ( PMsg<T> ) 的组件,以用于添加的组件。似乎您还希望拥有一组特定的已知组件来利用此自定义。这导致以下推理:

  1. 要使用您的组件,必须包含一个特定的 header (您没有命名它,所以我将使用 "pmsg.h" )。
  2. 新创建的组件可以而且可能应该在它们各自的标题中提供相关的自定义,即不需要在 "pmsg.h" 中自定义这些组件。 .
  3. 现有组件(例如 QVector<T>)不知道这种定制,要与您的组件无缝集成,需要在 "pmsg.h" 中声明它们的定制。 .未在 "pmsg.h" 中声明自定义所有用户都需要记住,除了现有组件的标题之外,还包括声明自定义的标题。假设自定义有一个默认实现,这不仅会产生意外结果,而且当不同的翻译单元在它们包含的 header 方面不一致时,很容易导致 ODR 违规。
  4. 对于非模板组件,您可以在 "pmsg.h" 中转发声明组件声明自定义然后实现它,而源文件中没有任何包含实现来自 "pmsg.h" 的声明.也就是说,对于正在定制的非模板组件,不需要在声明中包含相应的 header ,一个声明就足够了。
  5. 一般来说,您不能安全地向前声明一个类模板(主要是因为只能为第一个声明声明默认参数)。此外,您可能需要在 header "pmsg.h" 中提供模板化自定义的定义。 .也就是说,您需要在 "pmsg.h" 中包含您想要/需要自定义的所有模板类的声明。 .

tl;dr:如果您想为现有组件提供自定义,您需要在 header 中声明它们,为此您还需要包括它们各自的声明。

关于c++ - 我应该在模板类头文件中包含我需要的一切吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25472202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com