を呼び出すために、コンパイル時にはstd :: size_tのタイプを検出し、私は次の仮想関数を持っていますコンパイラによって異なることがあります。たとえば、Linux 64ビットでgccを使用した場合、std::size_t
はunsigned long int
ですが、Windows 64ビットのIntelの場合、std::size_t
はunsigned 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を使用します。
SFINAEのユースケースのようです。 – user0042
'std :: size_t'は常に型エイリアスですが、そうではありませんか?それらの2つのうちの1つでカバーされている場合は、オーバーロードを追加する必要はありません。 – StoryTeller
'save_unsigned_long_int'と' save_unsigned_long_long_int'ですか?オーバーロードがあるC++の* reason *をバイパスするのではないでしょうか?引数に複数の型を許す* 1つの*関数名ではないのはなぜですか? – paxdiablo