6

私はこのようなものを持っています:

typedef int AnotherType;
template <typename T> Func( T Value );

// And I want to specialize these two cases separately:

template <> bool Func<int>( int Value ) {...}
template <> bool Func<AnotherType>( AnotherType Value ) {...}

intに特化する必要はありません。本当に必要なのは、AnotherTypeに対して別の関数を実行することです。また、AnotherTypeまたは基本関数の定義を変更することはできません。

SFINAEのため、オーバーロードも役に立ちません。

4

5 に答える 5

3

答えはいいえだ。typedefを使用する場合、実際の型自体ではなく、型のエイリアスを作成します。コンパイラは両方を同じように扱います。それが理由です:

typedef int Foo;
typedef int Bar;

Bar bar = 1;
Foo foo = bar;

コンパイルします。どちらもintです。

于 2011-01-28T20:50:52.147 に答える
2

BOOST_STRONG_TYPEDEFを使用できます。

于 2011-01-28T20:57:37.143 に答える
1

コンパイラにintとAnotherTypeを異なる方法で処理させることはできないと確信しています。typedefが行うのはエイリアスタイプだけです。実際には新しいタイプは作成されません。typedef構造の定義により、コンパイラはすべての場合でintとAnotherTypeを同等に扱います。

異なる方法で処理されるintのみの型が必要な場合は、おそらく単一メンバーを作成する必要がありますstruct。含まれているintに対するほとんどの操作は、裸のintと同じマシンコードにコンパイルされますが、データ型に独自のテンプレート特殊化などを含めることができるようになりました。

于 2011-01-28T20:53:56.453 に答える
1

また、AnotherTypeまたは基本関数の定義を変更することはできません。

その後、あなたはねじ込まれています。ごめん。強力なtypedefを使用するように定義を変更できない場合、実際に使用できる唯一のオプションである強力なtypedefはオプションではありません。

于 2011-01-28T21:00:50.960 に答える
0

AnotherTypeはの別名であるため、コンパイラは両方の特殊化をまったく同じものとして扱いintます。に特化する必要はないと言うintので、その特殊化を完全に削除して、どんなタイプでも専門化させてAnotherTypeください。

于 2011-01-28T20:56:01.030 に答える