2017-09-03 10 views
-3

を呼び出すために、コンパイル時にはstd :: size_tのタイプを検出し、私は次の仮想関数を持っていますコンパイラによって異なることがあります。たとえば、Linux 64ビットでgccを使用した場合、std::size_tunsigned long intですが、Windows 64ビットのIntelの場合、std::size_tunsigned long long intです。最初のアプローチでは、私はそのようなことを書いた:私はそれに満足していないよ、は私自身のアーカイブシステムを管理する権利機能

void OutputArchive::save_size_t(std::size_t i) 
{ 
    if(boost::is_same<std::size_t,unsigned long int>::value) 
    this->save_unsigned_long_int((unsigned long int)i); 
    else if(boost::is_same<std::size_t,unsigned long long int>::value) 
    this->save_unsigned_long_long_int((unsigned long long int)i); 
    else { /* error management */ } 
} 

をしかし:それは醜いですが、一つだけの行は、これまでに実行することができ、型はコンパイル時に知られています。私は前処理でよりうまくいく可能性があると思いますが、これをどのように開始するのか分かりません。どんな助けも歓迎です。

注:私は互換性の理由からC++ 11を使用しませんが、Boostを使用します。

+5

SFINAEのユースケースのようです。 – user0042

+0

'std :: size_t'は常に型エイリアスですが、そうではありませんか?それらの2つのうちの1つでカバーされている場合は、オーバーロードを追加する必要はありません。 – StoryTeller

+11

'save_unsigned_long_int'と' save_unsigned_long_long_int'ですか?オーバーロードがあるC++の* reason *をバイパスするのではないでしょうか?引数に複数の型を許す* 1つの*関数名ではないのはなぜですか? – paxdiablo

答えて

1

プリプロセッサは型について何も知らない。または範囲。あるいは、プログラムのセマンティクスを含むもの。対処できるすべてのプリプロセッサは、少数の字句規則セットに対応する文字シーケンスだけのトークンです。要するに、タイプがコンパイル時に知られているが、プリプロセッサに対応する変換フェーズでは分からないことは事実である。 C++はコンパイル時に型情報を使用して、適切なオーバーロードされた関数を決定し、正しいテンプレート定義を推論します。いずれかが問題の適切な解決策になる可能性があります。

C++標準では、size_tが「符号なし整数型」であることだけが必要であることに気づくはずです。 標準符号なし整数型(§ 3.9.1p1を参照)である必要はないため、size_tunsigned int,unsigned long intでもunsigned long long intでもない可能性があります。 (同様のコメントはptrdiff_tと符号付き整数型に適用されます)

関連する問題