相关疑难解决方法(0)

编译时间字符串散列

我在几个不同的地方读过,使用C++ 11的新字符串文字,可以在编译时计算字符串的哈希值.然而,似乎没有人准备出来说它将是可能的或如何完成.

  • 这可能吗?
  • 操作员会是什么样子?

我特别感兴趣的是这样的用例.

void foo( const std::string& value )
{
   switch( std::hash(value) )
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      /*many more cases*/
      default: other(); break;
   }
}
Run Code Online (Sandbox Code Playgroud)

注意:编译时哈希函数不必像我编写的那样完全.我尽力猜测最终解决方案的样子,但meta_hash<"string"_meta>::value也可能是一个可行的解决方案.

c++ hash metaprogramming c++11

95
推荐指数
10
解决办法
4万
查看次数

为什么拥有多行constexpr功能是不正确的?

根据广义常量表达式 - 修订版5,以下是非法的.

constexpr int g(int n) // error: body not just ‘‘return expr’’
{
    int r = n;
    while (--n > 1) r *= n;
    return r;
}
Run Code Online (Sandbox Code Playgroud)

这是因为所有'constexpr'函数都必须具有这种形式{ return expression; }.我看不出有任何理由需要这样做.

在我看来,唯一真正需要的是不读取/写入外部状态信息,传入的参数也是'constexpr'语句.这意味着对具有相同参数的函数的任何调用都将返回相同的结果,因此可以在编译时"知道".

我的主要问题是,它似乎只是强迫你做一些真正的回旋形式的循环,并希望编译器优化它,以便它对非constexpr调用同样快.

constexpr为上面的例子写一个有效的,你可以这样做:

constexpr int g(int n) // error: body not just ‘‘return expr’’
{
    return (n <= 1) ? n : (n * g(n-1));
}
Run Code Online (Sandbox Code Playgroud)

但是这很难理解,你必须希望编译器在使用违反要求的参数调用时处理尾递归const-expr.

c++ rationale c++11

25
推荐指数
2
解决办法
5988
查看次数

标签 统计

c++ ×2

c++11 ×2

hash ×1

metaprogramming ×1

rationale ×1