質問

私は自分自身の準備をしています ユーザー定義のリテラル とともに Variadicテンプレート

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を最も遠くにシフトするため、左端のものではありません。

それはおそらく私は小さなことですが、私はそれを見ることができません。

  • ラインを修正できますか _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...>() ;
}
役に立ちましたか?

解決

再帰のいずれかのステップで、左端の数字のランクをすでに知っています。

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>() << (1 + sizeof...(ES)) | _bin<D,ES...>();
}

他のヒント

パラメーターパックは比較的柔軟性があり、通常はアルゴリズムを直接書き込むことはありません。 Variadic関数テンプレートは転送に適していますが、私はそれをより管理しやすいものに詰め込むことができます tuple 操作する前に。

シンプルを使用します binary_string_value 1の場所が最初に来るメタ機能とジェネリック tuple_reverse メタ機能、パターンはそうです

template< char ... digit_pack >
constexpr unsigned long long _bin() {
    typedef std::tuple< std::integral_constant< digit_pack - '0' > ... > digit_tuple;
    return binary_string_value< typename tuple_reverse< digit_tuple >::type >::value;
}

1つの可能性は、アキュムレータを使用することです。

template <char C>
int _binchar();
template<>
int _binchar<'0'>() { return 0; }
template<>
int _binchar<'1'>() { return 1; }

template<char C>
int _bin(int acc=0) {
   return (acc*2 + _binchar<C>());
}
template<char C, char D, char... ES>
int _bin(int acc=0) {
   return _bin<D, ES...>(acc*2 + _binchar<C>());
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top