Специализированная функция-член C ++ на основе аргумента шаблона класса

У меня есть класс с параметром шаблона, который должен решать, какой из двух стилей данных он содержит. На основе этого параметра я хочу реализовать функцию-член одним из двух разных способов. Я пробовал использовать Boost Enable-If, но безуспешно. Вот версия кода, которая меня больше всего удивляет, не работает:

#include 
enum PadSide { Left, Right };
template  struct dummy { dummy(int) {} };

template 
struct String
{
    typename boost::enable_if_c::type
        getRange(dummy<0> = 0) {}
    typename boost::enable_if_c::type
        getRange(dummy<1> = 0) {}
};

int main()
{
    String field;
    field.getRange();
}

На это g ++ 4.6.0 сообщает:

no type named ‘type’ in ‘struct boost::enable_if_c

Конечно, вторая перегрузка не должна работать, но ее следует игнорировать благодаря СФИНАЕ. Если я удалю фиктивные параметры функции, g ++ скажет следующее:

‘typename boost::enable_if_c<(Pad == Right), void>::type
    String::getRange()‘
cannot be overloaded with
‘typename boost::enable_if_c<(Pad == Left), void>::type
    String::getRange()‘

Вот почему я поместил туда фиктивные параметры в первую очередь - следуя разделу «Обходные пути компилятора» документации .

В основном, что Я хочу иметь две реализации getRange () и выбирать одну или другую в зависимости от типа Pad. Я надеялся, что Enable-If позволит мне сделать это, не создавая вспомогательные классы, которым можно было бы делегировать работу (что я пока попробую).

5
задан John Zwinck 14 July 2011 в 15:45
поделиться