提升单位使用问题 - hash_value,计数乘法

时间:2012-06-18 17:17:27

标签: c++ boost hash boost-units

我正在尝试自学Boost Unit,但在使用单位作为浮动替代品时遇到了一些问题。

  1. 我正在使用自定义dalton / amu单元进行计算。我的旧代码就像

    一样
    float baseMass = 14.95;
    float totalMass = baseMass * 12;
    

    然而,对单位做同样的事情(dalton_t是数量的typedef)

    dalton_t baseMass = 14.95 * units::dalton_mass;
    dalton_t totalMass = baseMass * 12;
    

    提供错误“二进制表达式的无效操作数”。这是否意味着12应该是某种无量纲单位?

  2. 我还将质量用作无序集合中的关键字。

    typedef boost::unordered_set<types::dalton_t> DaltonSet;
    DaltonSet dSet;
    dalton_t testMass(13384.384 * phobos::units::dalton_mass);
    dSet.insert(testMass);
    

    这提供了一个错误“没有用于调用hash_value的匹配函数”,即使它是在单元的头文件中定义的。

  3. 其中任何一个的想法?

    单位头文件如下:

    #ifndef UNITS_H_
    #define UNITS_H_
    #include <boost/functional/hash.hpp>
    #include <boost/units/conversion.hpp>
    #include <boost/units/io.hpp>
    #include <boost/units/pow.hpp>
    #include <boost/units/systems/si.hpp>
    #include <boost/units/systems/si/prefixes.hpp>
    
    namespace phobos {
    
    
    namespace units {
    using boost::units::mass_dimension;
    using boost::units::pow;
    using boost::units::root;
    using boost::units::quantity;
    using boost::units::unit;
    
    struct amu_mass_base_unit :
        boost::units::base_unit<amu_mass_base_unit, mass_dimension, 1> {
            static std::string name() { return "atomic mass unit"; }
            static std::string symbol() { return "u"; }
        };
    
        typedef boost::units::make_system<amu_mass_base_unit>::type amu_system;
        typedef unit<mass_dimension, amu_system> amu_mass;
        static const amu_mass dalton_mass;
    } /* namespace units */
    
    namespace types {
    using boost::units::quantity;
    typedef quantity<units::amu_mass, float> amu_t;
    typedef amu_t dalton_t;
    } /* namespace types */
    } /* namespace phobos */
    
    BOOST_UNITS_DEFINE_CONVERSION_FACTOR(phobos::units::amu_mass_base_unit,
            boost::units::si::kilogram_base_unit,
            float, 1.66053892173e-27);
    
    std::size_t hash_value(const phobos::types::amu_t &amu) {
        return boost::hash_value(amu.value());
    }
    
    #endif /* UNITS_H_ */
    

    提前谢谢!

    亚当

2 个答案:

答案 0 :(得分:2)

你的第一个问题消除了Boost的一个已知弱点。单位:算术表达式中没有类型提升,因此标量必须与数量相匹配。类型。 baseMass * 12.0f应该有用。

答案 1 :(得分:1)

对于不可清洗的增压装置,我也想到了:

namespace std {
template <> struct hash<phobos::types::amu_t> {
    inline std::size_t operator()(const phobos::types::amu_t &amu) const {
        return std::hash<phobos::types::mass_store_t>()(amu.value());
    }
};
}