我正在为使用可变参数模板定义用户定义的文字做准备
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...>() ;
}