operator float()
とoperator float() const
をオーバーロードしようとすると問題が発生しました。私は、両方のオーバーロードを使って、 "do do"と "just read"の異なるバージョンを提供することができると考えましたが、これらのオーバーロードが含まれているクラスの静的インスタンスではそれができません。問題はかなりこれに軽減煮詰めオペレータfloat()とfloat()constを静的メンバーで暗黙的に変換
:
次の出力を生成し// Does some math and should convert to float
struct ToFloat
{
// float conversion here
operator float()
{
cout << "called operator float() of " << s << "\n";
f += 1.0f;
return f;
}
// just get current value here
operator float() const
{
cout << "called operator float() *const* of " << s << "\n";
return f;
}
float f;
std::string s;
};
// Uses a static and a normal member of ToFloat
struct Container
{
// return both instances (with some more math before)
operator float()
{
return s * m;
}
// just provide read access
operator float() const
{
return s * m;
}
static inline ToFloat s { 1.0f, "static" };
ToFloat m { 1.0f, "member" };
};
// Uses the container, but must also provide read-only access
struct Use
{
// Give me operator float() of my container
float get()
{
return c;
}
// Give me operator float() const of my container
float getC() const
{
return c;
}
Container c {};
};
int main()
{
Use u {};
printf("getC() %f \n\n", u.getC());
printf("get() %f \n\n", u.get());
printf("getC() %f \n\n", u.getC());
}
...
called operator float() of static
called operator float() *const* of member
getC() 2.000000
called operator float() of static
called operator float() of member
get() 6.000000
called operator float() of static
called operator float() *const* of member
getC() 8.000000
ToFloat
の静的インスタンスが常に使用していますなぜ私は本当に得ることはありませんconst
と宣言されている関数から呼び出されたとしても、const
の変換はありませんか?ここにどんなルールが適用されますか?
静的メンバは、クラスのインスタンスが 'const'であるという理由だけで、' const'ではありません。また、そのインスタンスのコードからは* constとして表示されません。無関係ですが、デフォルトの 'double'の代わりに' float'を使用するのは、一般的に単なるsillywarningsの招待であり、メンテナはあなたが何をしているのか理解しようと時間を無駄にしています。 –
ターゲットプラットフォームでハードウェアでダブルをサポートしていません。 – Vinci
@ Cheersandhth.-Alf 'float'と' double'は本当ですか?私は数多くのコードでは、「倍精度」の精度がスピードとメモリのコストに見合っています。 – Angew