2013-06-17 8 views
6

浮動小数点に似た独自のデータ型(sfloat)を定義しようとしていますが、データの範囲と精度に合わせて異なる仮数ビットと指数ビットを使用します。目標は、既存のアプリケーションでfloatを置き換えることができる新しいデータ型を定義することです。すべてのは、私がクラスのオーバーロード `unsigned`指定子

unsigned sfloat(3.141527) 

usfloat(3.141527)、このクラスの符号なしのバージョンを返すようunsigned演算子をオーバーライドするか定義することができなかったことを除いて、これまでのワークアウト。

unsigned指定 VSのインテリセンスは、ヘッダファイルに文句を言っていないため、オーバーロードすることができるかもしれないように思え:

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

しかし、それは宣言と初期化に取り組んでいない:

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

C++でこれが可能かどうか分からないし、誰かがこれを前にしていたのか不思議ですね。

+1

'unsigned'ありません' const'や 'volatile'のような修飾子。これは 'short'や' long'のような型名の不可分な部分です。 'unsigned'自体は' unsigned int'の同義語ですので、 'operator unsigned()'は単に 'unsigned int'にキャストする演算子です。 – Oktalist

答えて

7

符号つきのためのC++のdefault-intのため、operator unsigned()は、operator unsigned int()の単なる構文上の略語です。ユーザー定義型はsignedまたはunsignedと宣言できません。

3

あなたがしようとしていることを達成するための直接的な方法はありません。彼の答えに記載されている@Angewのように、unsignedはユーザ定義型には適用できません。 とunsigned_sfloatの間で変換が定義されているタイプを定義することで、これを偽造することができます。その後、

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

を書き込み、

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

これはあなたが望むものに構文的に近いものを与え、言語はあなたがunsignedを使わせないという事実を回避しますと変換演算子を定義することができますキーワードを使用してカスタムタイプを変更します。

希望すると便利です。

0

次のことを試してみてください。

template<typename T> 
struct Unsigned; 

など、それを使用します。今すぐ

Unsigned<sfloat> usfloat 

、「あなたはあなたのタイプFloatためUnsignedを専門とする必要がありますが、これは通信する必要がFloatの符号なしバージョンです。 "unsigned_sfloatタイプよりもわずかに優れています。しかし、もしあなたがこのようなタイプのライブラリ全体を構築する場合には、Unsigned<>を添付したいと思うなら、私はこれを気にしません。

1

あなたはテンプレートでこのような何かをモックアップできます

#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; 
} 
+0

これは、浮動小数点数が符号なしであるかどうかを検出するのではなく、そのクラスを変更して符号付きまたは符号なしにする方法ではありませんか? – templatetypedef

+0

@templatetypedef特殊化のため、必要に応じて、署名付きバージョンと署名なしバージョンの実装を完全に異ならせることができます。もちろん、共通の機能を引き出すこともできます。 – jerry

+0

@ jerry-ああ、決して心配しないでください。ポストを編集して、専門分野にも実装の完全な本体が含まれていることに言及しました。コメントを投稿した時点で、専門分野には 'isSigned'定数しかありませんでした。 – templatetypedef

関連する問題