【发布时间】:2011-11-12 18:40:09
【问题描述】:
我正在为使用可变参数模板
定义用户定义的文字做准备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...>() ;
}
【问题讨论】:
-
sizeof...实现出了什么问题? -
没有错。但是因为我最初认为我的递归是“错误的方式”,所以我不能停止沿着这些思路思考。
标签: recursion c++11 variadic-functions variadic-templates