方法的输入取决于模板结构

Inputs of a method depending on the template structure

template <typename Stru_>
    class templateClasse{
    public:
    
      using stru = Stru_;
    
      static void method_0(int sk, int sl){
        printf("class templateClass method_0 sk: %d sl: %d\n", sk, sl);
      }
    
      static void method_1(int a){
        if (stru::isvec){
          method_0(0, a);
        } else{
          method_0(a, 0);
        }
      }
    };

我想根据代码显示的 bool stru::isvec 更改 method_0 中的输入,同时,我希望 if (stru::isvec) else 分支的选择是在编译 而不是运行时。我的问题是:

  1. 这段代码在编译时是否选择了method_0
  2. 只有在这两个方法前加上关键字static才能编译成功。为什么 static 在这种情况下有效?通常,我对static的理解是这样的:

These static variables are stored on static storage area, not in stack.

我知道当我使用 static const int tmp = 50; 时,这个 tmp 是在编译时计算的。那么static是不是可以粗略的理解为帮助编译期计算的关键字呢?

  1. 在这种情况下我们还有其他解决方案吗?

提前致谢!

  1. Does this code choose the method_0 during compilation?

不,派送发生在 运行 时间。

您可以使用 constexpr if (since C++17) 在编译时执行分派。

void method_1(int a){
  if constexpr (stru::isvec){
    method_0(0, a);
  } else{
    method_0(a, 0);
  }
}
  1. The code is successfully compiled only when I add the keyword static before those two methods.

不,您不必这样做。这是一个附带问题;在 class 定义中 static 用于声明未绑定到 class 实例的 static members

LIVE

对于 C++11,您可以使用 SFINAE 执行重载。例如

template <typename T = Stru_>
typename std::enable_if<T::isvec>::type method_1(int a){
   method_0(0, a);
}
template <typename T = Stru_>
typename std::enable_if<!T::isvec>::type method_1(int a){
   method_0(a, 0);
}

LIVE