5

我有一个带有模板参数的类,它应该决定它包含两种数据样式中的哪一种。基于该参数,我想以两种不同的方式之一实现成员函数。我尝试使用 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 能让我做到这一点,而无需制作辅助类来委派工作(我将同时尝试)。

4

1 回答 1

7

由于您将制作两个不同版本的getRange()反正,您总是可以struct String根据PadSide. 我知道它不是“漂亮”,但最终,它仍然是相似数量的代码,并且您不必制作多个类类型。

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

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

template<>
void String<Left>::getRange() { /*....*/ }
于 2011-07-14T15:56:53.910 回答