【发布时间】:2015-05-14 03:02:43
【问题描述】:
我想实现一个基于布尔模板参数的私有函数。类似的东西:
#include <iostream>
using namespace std;
template <bool is_enabled = true>
class Aggregator {
public:
void fun(int a) {
funInternal(a);
}
private:
void funInternal(int a, typename std::enable_if<is_enabled>::type* = 0) {
std::cout << "Feature is enabled!" << std::endl;
}
void funInternal(int a, typename std::enable_if<!is_enabled>::type* = 0) {
std::cout << "Feature is disabled!" << std::endl;
}
};
int main()
{
Aggregator<true> a1;
Aggregator<false> a2;
a1.fun(5);
a2.fun(5);
return 0;
}
但上面的程序无法编译:错误:在 'struct std::enable_if' void funInternal(int a, typename std::enable_if::type* = 0) 中没有名为 'type' 的类型。
是否可以通过 enable_if 实现所需的行为?
【问题讨论】:
-
不说为什么,我可以说这可能是您可以对代码进行的最小更改:coliru.stacked-crooked.com/a/480dd15245cdbb6f
-
啊,所以诀窍是从类模板参数创建一个方法参数?
-
我认为它的工作原理与此相同:youtube.com/watch?v=dTeKf5Oek2c&t=2244
-
@chris 如果我没记错的话,在 OP 中,重载是基于 value (即非类型模板参数),而该视频正在重载不同种类。不管这个细节如何,你认为它应该仍然有效吗?
-
@JamesAdkison,有点不同,但该值成为
std::enable_if的第一个参数。应用相同的逻辑,用户可以调用a1.fun<false>(5),事情会发生变化,就像std::enable_if的正常使用一样。