我有一个带有模板参数的类,它应该决定它包含哪两种数据样式。基于该参数,我想以两种不同的方式实现成员函数。我尝试使用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()‘
这就是我将伪参数放在首位的原因 - 遵循the documentation的编译器变通办法部分。
基本上我想要的是有两个getRange()实现,并根据Pad类型选择一个或另一个。我希望Enable-If能让我在没有辅助类的情况下将工作委托给我(我将在此期间尝试)。
答案 0 :(得分:7)
由于您将要制作两个不同版本的getRange()
,因此您可以根据struct String
的类型重载PadSide
成员函数。我知道它不是那么“漂亮”,但最后,它仍然是一个相似数量的代码,你不必创建多个类类型。
template<PadSide Pad>
struct String
{
void getRange();
};
template<>
void String<Right>::getRange() { /*....*/ }
template<>
void String<Left>::getRange() { /*....*/ }