我正在尝试实现数字文字运算符模板。
#include <string_view>
#include <cstdint>
#include <cmath>
#include <iostream>
#include <boost/mp11/integer_sequence.hpp>
#include <boost/mp11/algorithm.hpp>
using namespace boost::mp11;
template <char... Cs>
[[nodiscard]] constexpr auto operator""_c(){
int weight =std::pow(10, sizeof... (Cs));
// unused, would like to transform it using lambda that mutably captures
// weight
using ints = index_sequence<sizeof... (Cs)>;
// ugly fold way
auto val = ((weight/=10,(int)(Cs-'0')*weight) + ...);
return val;
}
int main(){
std::cout << 0_c << std::endl;
std::cout << 00_c << std::endl;
std::cout << 01_c << std::endl;
std::cout << 123_c << std::endl;
}
此代码适用于简单的情况(正确性并不重要,例如负数),它只是一个示例,但代码看起来很难看,并且 clang 会发出多次修改权重的警告,所以我猜代码是错误的(未定义或未指定的行为)虽然它似乎工作......
现在我想知道有没有办法让我ints
用有状态的 lambda(修改权重)来转换我使用的(它来自 boost::mp11,但同样的东西存在于 std::)。所以我想将整数转移<0,1,2>
到类似的东西中<100,10,1>
我想这已经被问过了,但这很难搜索。
需要明确的是:运算符“”只是一个玩具问题,我真正的问题是关于用有状态的 lambda 映射整数序列的值。
另外,如果问题不清楚:我很高兴使用 boost mp11,但在文档中找不到任何内容。