首页 > 解决方案 > 使用 Boost::Units 递归模板的前向声明

问题描述

由于我正在寻求减少代码的编译时间,因此我目前正在尝试减少头文件中的大量包含。为此,我向前声明函数参数,如下例所示:

// Class A.h
class B;

class A
{
   ...
   void foo(B);
}

但是,我没有找到一种方法来转发声明我们的类型定义,它依赖于提升单位,例如文件 Object.h 中作为函数参数所需的长度单位 (Length.h) 的定义:

// Length.h
using meter_unit = boost::units::si::meter_base_unit::unit_type;
using Length = boost::units::quantity<meter_unit, double>;
BOOST_UNITS_STATIC_CONSTANT(Meter, meter_unit);
BOOST_UNITS_STATIC_CONSTANT(Meters, meter_unit)

// Object.h
#include <Length.h> // This include shall be avoided

class Position; 
class Object {
 ... 

    bool isNearby(Position pos, Length distance); 
}

关于我如何实现这一目标有什么建议吗?

我试过的:

第一种方法:我尝试向前声明模板 boost::units::quantity<meter_unit, double>; 但是我努力在meter_unit的命名空间内定义包含模板类meter_base_unitunit_typemeter_unit

Meter_base_unit在 boost 单元定义如下(简化),我猜unit_type是在宏BOOST_TYPEOF_REGISTER_TYPE内定义的。

// Boost ... Units/Meter.hpp
namespace boost::units::si {
    struct meter_base_unit : public base_unit<meter_base_unit, length_dimension, -9>
    {
        static std::string name()   { return("meter"); }
        static std::string symbol() { return("m"); }
        };
    }
}
BOOST_TYPEOF_REGISTER_TYPE(boost::units::si::meter_base_unit)

这样的星座甚至可以提前申报吗?如果没有,是否存在可能具有相同好处的替代方案(在仍然使用 Boost Units Library 时避免包含)。

第二种方法:定义从各个单元继承的类,例如:

class Length : public boost::units::quantity<meter_unit, double>

但问题是,然后我必须为我尝试使用(英尺、米、公里等)初始化长度单位的每个可能单位创建 CTR,这基本上是在重新实现库。

第三种方法:创建一个仅包含长度单位作为变量的类,然后导致该类的所有可能的运算符重载。

我很高兴为我的具体问题所做的每一项贡献以及导致对模板前向声明的更深入理解的每一项贡献。

提前致谢

段错误创建者

标签: c++templatesboostforward-declarationboost-units

解决方案


推荐阅读