方法的输入取决于模板结构
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
分支的选择是在编译 而不是运行时。我的问题是:
- 这段代码在编译时是否选择了
method_0
?
- 只有在这两个方法前加上关键字
static
才能编译成功。为什么 static
在这种情况下有效?通常,我对static
的理解是这样的:
These static variables are stored on static storage area, not in
stack.
我知道当我使用 static const int tmp = 50;
时,这个 tmp
是在编译时计算的。那么static
是不是可以粗略的理解为帮助编译期计算的关键字呢?
- 在这种情况下我们还有其他解决方案吗?
提前致谢!
- 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);
}
}
- The code is successfully compiled only when I add the keyword
static
before those two methods.
不,您不必这样做。这是一个附带问题;在 class 定义中 static
用于声明未绑定到 class 实例的 static
members。
对于 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);
}
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
分支的选择是在编译 而不是运行时。我的问题是:
- 这段代码在编译时是否选择了
method_0
? - 只有在这两个方法前加上关键字
static
才能编译成功。为什么static
在这种情况下有效?通常,我对static
的理解是这样的:
These static variables are stored on static storage area, not in stack.
我知道当我使用 static const int tmp = 50;
时,这个 tmp
是在编译时计算的。那么static
是不是可以粗略的理解为帮助编译期计算的关键字呢?
- 在这种情况下我们还有其他解决方案吗?
提前致谢!
- 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);
}
}
- The code is successfully compiled only when I add the keyword
static
before those two methods.
不,您不必这样做。这是一个附带问题;在 class 定义中 static
用于声明未绑定到 class 实例的 static
members。
对于 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);
}