0

データ型に基づいて値を出力するテンプレートクラスを作成しました。つまり、longは符号付き整数(10進数)としてRESULT出力されますが、16進形式で出力されます。私は次のように定義RESULTしました:

typdef long RESULT.

RESULTのように扱われ、longの出力ルーチンが呼び出されることはないため、これは正しく機能していませんRESULT(代わりにlongのルーチンが呼び出されます)。これに対する回避策はありますか?

4

3 に答える 3

2

あなたが望むものは、与えられた理由でうまくいきません。

必要に応じて出力をフォーマットする Function オブジェクトを追加するだけではどうですか。

class A {
    template< typename T>
    std::string output(long val) {return T(val)}
}

struct decimal {
    std::string operator()(long val) {//return decimal}
}

struct hex {
    std::string operator()(long val) {//return hex}
}

ユースケースの例:

A a;
cout << a.output<decimal>(10) << endl;
cout << a.output<hex>(10) << endl;
于 2012-09-14T21:04:29.197 に答える
1

これは予想されます。

typedefは、コンパイラが型を認識する方法を変更しません。型の新しい名前(この場合はRESULT)を作成します。これは同じ型であるため、指定された型と同じ動作とコードを使用します。ケースが長い。

于 2012-09-14T20:48:49.653 に答える
1

typedefaliasタイプのみを宣言します。あなたの例にはいくつかの " " を使うことができtemplate magicます。

template<typename T, int I>
struct true_typedef
{
    explicit true_typedef(const T& val):value(val) { }
    T value;
};

typedef true_typedef<long, 0> RESULT;

例。

http://liveworkspace.org/code/1fc907ae5cddc23bd7d9545cfafa8a05

于 2012-09-14T20:59:06.277 に答える