Предотвращение дублирования определений функций в специализациях шаблонов

Класс Widget имеет некоторые функции, которые применяются для всех типов параметров (общие функции), и другие функции, которые должны быть специализированы для данных типов (необычные функции).

g ++ настаивает на том, чтобы специализация for Widget также должен определять common_fn (), а не только uncommon_fn (), но это в первую очередь противоречит цели использования специализации. Как можно избежать повторения common_fn ()?

#include <cassert>

template<typename Type> struct Widget
{
    Widget() {}
    char common_fn() { return 'a'; }
    int uncommon_fn() { return 1; }
};

template<> struct Widget<char>
{
    Widget() {}
    int uncommon_fn() { return 2; }
};

int main()
{
    Widget<char> WidgetChar;
    assert( WidgetChar.common_fn() == 'a' ); // Error
    assert( WidgetChar.uncommon_fn() == 2 );
}

begin-edit

to Alf:

Я не могу использовать

template<> int Widget<char>::uncommon_fn() { return 2; }

, потому что некоторые необычные функции должны возвращать тип признака (и поэтому это было чрезмерно для упрощения путем создания фактического примитива типа).

Или действительно есть способ заставить компилятор распознавать typename Foo :: Bar при записи

struct Foo { typedef FooBar Bar; };
template<> typename Foo::Bar Widget<Foo>::uncommon_fn() { return ....; }

?

end-edit

] begin-edit2

в iammilind:

Это интересно, но я не могу использовать производное от Widget (или возможно более ясное решение рефакторинга общих частей в родительский класс GeneralWidget) по той же причине. Общие части не совсем обычные. Их объявления и их определения выглядят одинаково, но из-за того, что они используют черты, они в конце совершенно разные.

end-edit2

10
задан Calaf 19 August 2011 в 04:14
поделиться