Joh*_*nck 5 c++ templates boost overloading enable-if
我有一个带有模板参数的类,它应该决定它包含哪两种数据样式.基于该参数,我想以两种不同的方式实现成员函数.我尝试使用Boost Enable-If,但没有成功.这是我最惊讶的代码版本不起作用:
#include <boost/utility/enable_if.hpp>
enum PadSide { Left, Right };
template <int> struct dummy { dummy(int) {} };
template <PadSide Pad>
struct String
{
typename boost::enable_if_c<Pad == Left, void>::type
getRange(dummy<0> = 0) {}
typename boost::enable_if_c<Pad == Right, void>::type
getRange(dummy<1> = 0) {}
};
int main()
{
String<Left> field;
field.getRange();
}
Run Code Online (Sandbox Code Playgroud)
为此,g ++ 4.6.0说:
no type named ‘type’ in ‘struct boost::enable_if_c<false, void>’
Run Code Online (Sandbox Code Playgroud)
当然,第二次重载应该不起作用,但是由于SFINAE,它应该被忽略.如果我删除虚函数参数,g ++会这样说:
‘typename boost::enable_if_c<(Pad == Right), void>::type
String<Pad>::getRange()‘
cannot be overloaded with
‘typename boost::enable_if_c<(Pad == Left), void>::type
String<Pad>::getRange()‘
Run Code Online (Sandbox Code Playgroud)
这就是为什么我把伪参数放在那里 - 遵循文档的Compiler Workarounds部分.
基本上我想要的是有两个getRange()实现,并根据Pad类型选择一个或另一个.我希望Enable-If能让我在没有辅助类的情况下将工作委托给我(我将在此期间尝试).
由于您将要生成两个不同版本的版本getRange()
,因此您可以struct String
根据类型重载您的成员函数PadSide
.我知道它不是"漂亮",但最后,它仍然是类似的代码量,你不必创建多个类类型.
template<PadSide Pad>
struct String
{
void getRange();
};
template<>
void String<Right>::getRange() { /*....*/ }
template<>
void String<Left>::getRange() { /*....*/ }
Run Code Online (Sandbox Code Playgroud)