如何将用户定义的文字中的可变字符模板参数转换回数字类型?
由于这个而提出这个问题。
C++11 允许您为数字文字定义如下文字:
template<char...> OutputType operator "" _suffix();
这意味着 503_suffix
将变为 <'5','0','3'>
这很好,尽管它的形式不是很有用。
如何将其转换回数字类型?这将变成<'5','0','3'>
转换为 constexpr
503
。此外,它还必须适用于浮点文字。 <'5','.','3>
会变成 int 5
或 float 5.3
在 < a href="https://stackoverflow.com/questions/8108473/user-define-literal-arguments-are-not-constexpr/8108872">上一个问题,但它没有处理非整数:
template <typename t>
constexpr t pow(t base, int exp) {
return (exp > 0) ? base * pow(base, exp-1) : 1;
};
template <char...> struct literal;
template <> struct literal<> {
static const unsigned int to_int = 0;
};
template <char c, char ...cv> struct literal<c, cv...> {
static const unsigned int to_int = (c - '0') * pow(10, sizeof...(cv)) + literal<cv...>::to_int;
};
// use: literal<...>::to_int
// literal<'1','.','5'>::to_int doesn't work
// literal<'1','.','5'>::to_float not implemented
This question is being asked because of this one.
C++11 allows you to define literals like this for numeric literals:
template<char...> OutputType operator "" _suffix();
Which means that 503_suffix
would become <'5','0','3'>
This is nice, although it isn't very useful in the form it's in.
How can I transform this back into a numeric type? This would turn <'5','0','3'>
into a constexpr
503
. Additionally, it must also work on floating point literals. <'5','.','3>
would turn into int 5
or float 5.3
A partial solution was found in the previous question, but it doesn't work on non-integers:
template <typename t>
constexpr t pow(t base, int exp) {
return (exp > 0) ? base * pow(base, exp-1) : 1;
};
template <char...> struct literal;
template <> struct literal<> {
static const unsigned int to_int = 0;
};
template <char c, char ...cv> struct literal<c, cv...> {
static const unsigned int to_int = (c - '0') * pow(10, sizeof...(cv)) + literal<cv...>::to_int;
};
// use: literal<...>::to_int
// literal<'1','.','5'>::to_int doesn't work
// literal<'1','.','5'>::to_float not implemented
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
总有简单的方法。非类型参数包可以扩展为初始化列表,如下所示:
There's alwars the easy way. A non-type parameter pack can be expanded into an initializer list as follows:
我认为以下内容应该适用于没有指数部分的浮点数(未经测试):
如何将其扩展为也采用指数部分应该是显而易见的。
当然,人们还想做一些错误检查(确保字符确实是数字)。
I think the following should work on floats without exponential part (untested):
How to extend this to also take an exponential part should be obvious.
Of course one would also want to do some error checking (make sure that the characters are indeed digits).