如何根据模板参数“启用”功能?

时间:2014-01-20 06:45:05

标签: c++ templates c++11

我有一个模板功能:

template<class Route, bool enabled=true>
void addRoute() {
    std::cout << "Route added";
}

我想在enabled=false时禁用该功能。我知道除非使用宏,否则无法禁用从参数调用函数。但是,由于此函数将在程序的生命周期内调用一次,因此如果enabled被设置为false,我不介意调用空函数。所以,我尝试了第一个想到的事情:

template<class Route>
void addRoute<false>() { }

这失败了,所以我做了一些挖掘,发现部分模板专业化是不可能的;我可以使用参数创建一个部分专用的类并执行相同的操作。

有没有其他方法可以解决这个问题,还是应该坚持创建一个具有静态功能的类?

1 个答案:

答案 0 :(得分:2)

如果明确指定第二个参数,您想如何“禁用”该功能?默认情况下它是true并且没有推断,所以调用此函数的唯一方法是通过

addRoute<RouteType, false>();

在这种情况下,“禁用”只能意味着它会产生错误,对吗?如果你想要,只需添加

static_assert( enabled, "Not enabled!" );

以函数的主体作为第一行。或者如果你想“跳过”里面的代码,你可以简单地添加

if( !enabled ) return;

作为第一行。优化器将确保不会生成多余的代码。