Интересная дилемма, перегрузка шаблона
От: johny5 Новая Зеландия www.moddb.com/games/tachyon-wars1
Дата: 08.02.13 16:19
Оценка:
Всем привет.

Есть у меня код, позволяющий запросить параметр с класса по такому синтаксису:
// описание контейнера параметров
struct OneOfParamCont
{
    int param1;
    float param2;
};

// объект, может реализовать любой из классов параметров
struct Object
{
    // запрос параметра у объекта
    // если объект хранит в себе OneOfParamCont, то ф-ция вернёт значение параметра
    // иначе вернёт defaultVal 
    template<typename ParamClass, typename ParamType>
    ParamType  QueryParam( ParamType (ParamClass::*param), const ParamType& defaultVal = ParamType() )
    { ... }
};


Запросы вот такие:
int val = object.QueryParam( &OneOfParamCont::param1 );
float val2 = object.QueryParam( &OneOfParamCont::param2, 1.f );


Всё работает замечательно, но захотелось мне добавить перегрузку, чтобы возвращаемое значение можно было задавать самому, по такому синтаксису:
std::string = object.QueryParam<std::string>( &OneOfParamCont::param1 );

т.е. какой бы ни был реальный тип параметра, он конвертнётся в строку автоматом.

Но тут возник затык с декларацией ф-ции. Описываем перегрузку вот так:
    template<typename ResultType, typename ParamClass, typename ParamType>
    ResultType  QueryParam( ParamType (ParamClass::*param), const ResultType& defaultVal = ResultType() )
    { ... }


и вот такой код уже ломается компилироваться:
float val2 = object.QueryParam( &OneOfParamCont::param2, 1.f );


жалуется на ambiguity, потому что обе ф-ции подходят под определение, для второй декларации ResultType выводится из дефолтного значения

В общем как ни игрался, не вышел каменный цветок. Хочется сохранить именно такой интерфейс использования, чтобы у обоих вариантов было возвращаемое дефолтное значение.

Какие будут идеи?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.