【发布时间】:2016-08-06 09:03:40
【问题描述】:
我正在编写一个用户定义的string 文字来将月份名称转换为它们的数字。该文字的预期用法类似于
"Nov"_m
应该返回11。
目前我的代码看起来像
constexpr Duration operator ""_m(const char* str, size_t len)
{
return convert_month_to_int(str, len);
}
其中constexpr int convert_month_to_int(const char, size_t) 是一个进行实际转换的函数(如果月份名称不正确,则返回-1)。
问题是如果传递给这个文字的字符串没有命名任何月份,我想显示某种编译错误。我尝试通过以下方式使用static_assert:
constexpr Duration operator ""_m(const char* str, size_t len)
{
static_assert(convert_month_to_int(str, len) > 0, "Error");
return convert_month_to_int(str, len);
}
但这不起作用,因为编译器不确定convert_month_to_int(str, len) 将是一个常量表达式。
有没有办法实现这种行为?
【问题讨论】:
-
gcc 有扩展在这里使用模板方法。
-
@Jarod42 你的意思是可变参数模板用户定义的文字?它们不是仅用于整数和浮点类型吗?
-
抱歉愚蠢(已删除的答案)等等,但实际上,只有一小部分有效月份标识符,为什么不将其设为
enum?因为这就是enums 的用途。命名值,从中创建类型。 -
enum { Jan_m, Feb_m, ...漂亮! -
在我看来,您正在尝试使用参数创建一个函数,但使用 UDL 语法和
operator+。你的例子可以写成make_date(2016, Aug, 6, 12, 50)。我认为你的方式有缺陷的原因是因为三月多少钱? 59还是60?2016_y + "Aug"_m + "December"_m是什么?似乎只有一种方法可以对您的表达式进行排序,并且您最好使用函数调用。
标签: c++ c++11 user-defined-literals