在我的C ++程序中,我具有以下三个用户定义的文字运算符:
constexpr Duration operator""_h(unsigned long long int count) { return {count / 1.f, true}; }
constexpr Duration operator""_m(unsigned long long int count) { return {count / 60.f, true}; }
constexpr Duration operator""_s(unsigned long long int count) { return {count / 3600.f, true}; }
Duration保留了几个小时(作为浮动时间)和一个有效性标志。
所以我可以说:Duration duration = 17_m;
我可以说:int m = 17; Duration duration = operator""_m(m);
但是我不能说:
const char* m = "17_m"; Duration duration1 = operator""_(m);
const char* h = "17_h"; Duration duration2 = operator""_(h);
我的目标是operator""_()
就是我刚刚在那发明的,编译器在运行时会选择要调用的适当运算符。我知道我自己可以写类似的东西(事实上,在这种情况下我已经做过了),但是我不认为这种语言中已经有类似的东西了。我要在这里确认:这是语言吗?
答案 0 :(得分:1)
您想实现自己的解析器吗?这是可以扩展到constexpr
世界的草图:
#include <cassert>
#include <cstdlib>
#include <iostream>
constexpr Duration parse_duration(const char* input) {// input: \A\d*_[hms]\z\0
int numeric_value = 0;
// TODO: handle negative values, decimal, whitespace...
std::size_t pos = 0;
while(input[pos] != '_') {
unsigned digit = unsigned(input[pos++]) - unsigned('0');
assert(digit <= 9);
numeric_value *= 10;
numeric_value += digit;
}
char unit = input[pos+1];
assert(input[pos+2] == '\0' && "must end with '\0' after one-letter unit");
switch(unit) {
case 'h': return operator""_h(numeric_value);
case 'm': return operator""_m(numeric_value);
case 's': return operator""_s(numeric_value);
default: std::cerr << unit << std::endl;
}
assert(false && "unknown unit");
return {};
}
如果您不关心constexpr
,则应该使用@RemyLebeau评论中建议的一种较高级别的方法。