提升单位使用问题 - hash_value,计数乘法
Boost Units Usage Questions - hash_value, count multiplication
我正在尝试自学增强单元,但是在使用单位作为浮点替换时遇到了一些问题。
-
我正在使用自定义道尔顿/阿姆单位进行计算。我的旧代码的工作方式类似于
float baseMass = 14.95; float totalMass = baseMass * 12;
但是,对单位执行相同的操作(dalton_t是数量的类型定义)
dalton_t baseMass = 14.95 * units::dalton_mass; dalton_t totalMass = baseMass * 12;
提供错误"二进制表达式的操作数无效"。这是否意味着 12 应该是某种无量纲单位?
-
我还使用质量作为无序集合中的键。
typedef boost::unordered_set<types::dalton_t> DaltonSet; DaltonSet dSet; dalton_t testMass(13384.384 * phobos::units::dalton_mass); dSet.insert(testMass);
这将提供错误"调用hash_value没有匹配函数",即使它是在单元的头文件中定义的。
对这两个有什么想法吗?
单位头文件如下:
#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_ */
提前谢谢你!
亚当
你的第一个问题抓住了 Boost.Unit 的一个已知弱点:算术表达式中没有类型提升,因此标量必须与数量的类型匹配。 baseMass * 12.0f
应该有效。
至于提升单元不可散列,我也想通了:
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());
}
};
}
相关文章:
- 什么是"#include <boost/functional/hash.hpp> "?
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 为什么我会" void value not ignored as it ought to be"?
- 方法错误"not all control paths return a value"和方法不返回值
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- std::<key-value>不同类型的对向量
- c++ visual studio 64bit | save registers value
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 如何解决类成员函数中的"return a value"错误?
- bsoncxx: document::view vs document::value
- .value( "key" , default) 不适用于空的 json 对象吗?
- 对自定义类使用 std::hash<uint64_t>
- 如何在C++中设置演员的"Render Custom Depth Pass"和"Depth Stencil Value"?
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离复制到另一个隔离?
- Return value of std::hash ofr (x86/x64)