Я готовлюсь к определению пользовательских литералов с 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, а не самую левую.
Возможно, это крошечная вещь, но я просто не могу ее увидеть.
- МожетЯ исправляю строку
_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...>() ;
}