我有一个带有模板参数的类,它应该决定它包含两种数据样式中的哪一种。基于该参数,我想以两种不同的方式之一实现成员函数。我尝试使用 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();
}
对此,g++ 4.6.0 说:
no type named ‘type’ in ‘struct boost::enable_if_c<false, void>’
当然,第二个重载应该不起作用,但由于 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()‘
这就是为什么我将虚拟参数放在首位的原因——遵循文档的编译器解决方法部分。
基本上我想要的是有两个 getRange() 实现,并根据 Pad 类型选择一个或另一个。我希望 Enable-If 能让我做到这一点,而无需制作辅助类来委派工作(我将同时尝试)。