これは本当に最小限の例です。Boost.Unitsを次のように使用しています。
#define REAL double
...
using namespace boost::units;
quantity<si::velocity, REAL> v;
それから時々私は次のようなものが必要です
quantity<si::velocity, REAL> v_halved;
v_halved = 0.5 * v;
0.5
コンパイラはとして扱うので、これは問題なく動作しdouble
ます。しかし、REAL
何かが違うとコンパイルエラーが発生します。たとえば、定義をコンパイルエラーに変更すると、次のREAL
ようにlong double
なります。
error: no match for ‘operator*’ in ‘5.0e-1 * v’
/usr/include/boost/units/detail/one.hpp:58: note: candidates are: boost::units::one boost::units::operator*(const boost::units::one&, const boost::units::one&)
Boost.Units のドキュメントを調べる と、次のようにオーバーロードされていることがわかりました。operator*
// runtime scalar times quantity
template<typename Unit, typename X>
multiply_typeof_helper< X, quantity< Unit, X > >::type
operator*(const X & lhs, const quantity< Unit, X > & rhs);
double
スカラーと数量の内部型が同じでなければならないことは定義から明らかですが、変換が暗黙的に実行できる場合 ( from からへのように) コンパイラが自動的に型を変換することを期待しますlong double
。ただし、自動型変換は のような他の単純な関数でも確実に機能するため、何かが欠けている可能性があると思いますlong double f(long double const & ld)
。
私の問題は、私がv_halved = 0.5 * v
非常に多くの式を使用しており、私のプロジェクトがすでにかなり大きくなっていることです。これが問題であることを認識しなければならないことを定義REAL
しなければならないのは今だけです。long double
それで、私はこれに対する回避策/解決策について疑問に思っていました.それがstatic_cast<REAL>(0.5)
解決策になることは承知していますが、コンパイラーがスカラーを適切な型に自動的に変換できないことについて何かが欠けていると感じています.
よろしくお願いします!