基于类模板参数的Specialize C ++成员函数

时间:2011-07-14 15:45:06

标签: 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();
}

对此,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能让我在没有辅助类的情况下将工作委托给我(我将在此期间尝试)。

1 个答案:

答案 0 :(得分:7)

由于您将要制作两个不同版本的getRange(),因此您可以根据struct String的类型重载PadSide成员函数。我知道它不是那么“漂亮”,但最后,它仍然是一个相似数量的代码,你不必创建多个类类型。

template<PadSide Pad>
struct String
{
    void getRange();
};

template<>
void String<Right>::getRange() { /*....*/ }

template<>
void String<Left>::getRange() { /*....*/ }