6

float に似た独自のデータ型 ( と呼ばれる) を定義しようとしていますsfloatが、データの範囲と精度により適した仮数ビットと指数ビットの異なる数を使用します。目標は、既存のアプリケーションで float を置き換えることができる新しいデータ型を定義することです。unsigned演算子をオーバーライドまたは定義できなかったことを除いて、これまでのところすべてがうまくいっています。

unsigned sfloat(3.141527)

このクラスの符号なしバージョンを返しusfloat(3.141527)ます。

VS intellisense がヘッダー ファイルで文句を言っていないため、unsigned指定子がオーバーロードされる可能性があるようです。

sfloat::sfloat(float f) { m_data = get16bit(f); }
operator unsigned() { /*Do stuff here */ };

しかし、宣言と初期化では機能しません:

unsigned sfloat myPi= 3.141527; // Error: expected a ';'

これが C++ で可能かどうかさえ知りません。

4

4 に答える 4

8

C++ の符号付きの default-int により、operator unsigned ()は単なる構文上の省略形ですoperator unsigned int ()signedユーザー定義型を宣言することはできませんunsigned

于 2013-06-17T18:38:16.290 に答える
4

あなたがやろうとしていることを達成するための直接的な方法はありません。@Angew の回答で述べたように、unsignedユーザー定義型には適用できません。

一方、名前付きの型と、それらの間の変換が定義されている型を定義することで、これを偽造することができsfloatますunsigned_sfloat。その後、次のように書くことができます

unsigned_sfloat x(137.0f); // Close enough. ^_^

そして、変換演算子を次のように定義します

operator unsigned_sfloat() {
    ... implementation here ...
}

unsignedこれにより、必要なものに構文的に近いものが得られ、言語ではキーワードを使用してカスタム型を変更できないという事実を回避できます。

お役に立てれば!

于 2013-06-17T18:40:36.967 に答える
2

テンプレートを使用して、次のようなものをモックアップできます。

#include <type_traits>

template <typename T = int>
class myfloat
{
    static_assert(std::is_same<T, int>::value, "myfloat should only be instantiated on \"signed\" and \"unsigned\" ints");

    const bool isSigned = true;

    // the rest of the signed implementation  
};

template <>
class myfloat<unsigned>
{
    const bool isSigned = false;

    // the rest of the unsigned implementation  
};

int main()
{
    myfloat<> a;           // signed  
    myfloat<signed> b;     // signed  
    myfloat<unsigned> c;   // unsigned  

    // myfloat<float> d; // <-- compile error

    return 0;
}
于 2013-06-17T18:53:19.850 に答える