什么被认为是编译时分支?

Nik*_*iou 6 c++ templates overload-resolution template-meta-programming c++11

什么是技术/ c ++语言工具 - 提供编译时分支的功能?


第一次尝试枚举它们(我期待添加更正):

  1. 重载分辨率:例如,选择"最佳"版本适合所提供的参数

    void F(X& arg);
    void F(X&& arg); 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 模板特化:创建为"特殊参数"运行的代码 - 一种对模板元编程和编译时递归至关重要的技术

    template<int N> struct A    { /* implementation */ };
    template<>      struct A<0> { /* specific  code */ };
    
    Run Code Online (Sandbox Code Playgroud)
  3. SFINAE&expression sfinae:(1)的一个特例,为条件接口提供工具.

    template<class C, class F>
    auto test(C c, F f) -> decltype((c->*f)(), void()); // 'C' is pointer type
    
    Run Code Online (Sandbox Code Playgroud)

101*_*010 1

虽然不是严格的编译时分支,但您可以添加第四个选项:

4) C++

  #if SOMETHING
    ...
  #else
    ...
  #endif
Run Code Online (Sandbox Code Playgroud)

  • @NikosAthanasiou:严格来说,翻译的所有九个阶段都受到标准的同等对待。尽管其中只有“一些”是“编译”的,但它们都可能对元编程有用。 (3认同)
  • 这是预处理器时间 - 实际上是文本替换 (2认同)
  • 是的,这就是我说的不是严格的编译时间,尽管预处理是编译过程的一部分。 (2认同)