Variadic Templateを使用してユーザー定義リテラルを定義する準備をしています
template<...>
unsigned operator "" _binary();
unsigned thirteen = 1101_binary;
GCC 4.7.0 はまだサポートさoperator ""
れていませんが、それまでは簡単な関数でこれをシミュレートできます。
残念ながら、私の再帰は間違った方法です。右端の値をシフトせず、左端の値をシフトする良い方法は思いつきません:
template<char C> int _bin();
template<> int _bin<'1'>() { return 1; }
template<> int _bin<'0'>() { return 0; }
template<char C, char D, char... ES>
int _bin() {
return _bin<C>() | _bin<D,ES...>() << 1; // <-- WRONG!
}
もちろん、これはまったく正しくありません。
int val13 = _bin<'1','1','0','1'>(); // <-- gives 10
私の再帰は、一番左の '1' ではなく、一番右の '1' を一番遠くに移動するからです。
それはおそらく私の小さなものですが、私には見えません。
- 行を修正できます
_bin<C>() | _bin<D,ES...>() << 1;
か? - それとも、すべてを転送し、後ですべてを元に戻す必要がありますか (良くありません)?
- または、私が見ることができない他の方法はありますか?
更新:再帰を逆に折りたたむことはできませんでしたが、発見しsizeof...
ました。動作しますが、完全ではありません。別の方法はありますか?
template<char C, char D, char... ES>
int _bin() {
return _bin<C>() << (sizeof...(ES)+1) | _bin<D,ES...>() ;
}