基于类模板参数特殊化c++成员函数

Specialize C++ member function based on class template argument

本文关键字:c++ 成员 函数 特殊化 参数 于类模      更新时间:2023-10-16

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

既然你要做两个不同版本的getRange(),你总是可以重载你的struct String成员函数取决于PadSide的类型。我知道它不是那么"漂亮",但最终,它仍然是类似的代码量,并且您不必创建多个类类型。

template<PadSide Pad>
struct String
{
    void getRange();
};
template<>
void String<Right>::getRange() { /*....*/ }
template<>
void String<Left>::getRange() { /*....*/ }