【发布时间】:2015-10-10 15:45:40
【问题描述】:
昨天我读到了blog entry
关于将编译时已知函数参数从 constexpr 函数转换为 std::integral_constant<> 之类的类型。
一个可能的用法示例是从用户定义的文字转换类型。
考虑以下示例:
constexpr auto convert(int i)
{
return std::integral_constant<int, i>{};
}
void test()
{
// should be std::integral_constant<int, 22>
using type = decltype(convert(22));
}
但显然,正如预期的那样,Clang 会抛出以下错误:
error: ‘i’ is not a constant expression
return std::integral_constant<int, i>{};
^
上述博客的作者建议使用模板化的用户定义文字来拆分 将数字转换为 std::integer_sequence 以将其解析为 int。
但这个建议对我来说似乎没有用。
有没有一种有效的方法可以将编译时已知的函数参数转换为std::integral_constant<> 之类的类型?
【问题讨论】:
-
using type = decltype(convert(22));如何比别名模板(或变量模板)更具可读性? -
除了一厢情愿之外,您是否有任何理由怀疑您从该博客文章中获得的信息?它已经解释了为什么这是无效的,我看不出这里的答案告诉你同样的事情可以改进。
-
using type = decltype(convert(22))只是一个如何提取给定表达式类型的示例。我考虑了将表达式convert(22)解析为编译时 AST 表达式的可能性,该表达式可以在不使用宏或用户定义的文字的情况下从其他模板进行评估。