У меня есть класс с параметром шаблона, который должен решать, какой из двух стилей данных он содержит. На основе этого параметра я хочу реализовать функцию-член одним из двух разных способов. Я пробовал использовать 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 позволит мне сделать это, не создавая вспомогательные классы, которым можно было бы делегировать работу (что я пока попробую).