Шаблон C ++ и неоднозначный вызов функции

Некоторый код, который я не контролирую, имеет несколько перегруженных функций, которые принимают разные типы

то есть

setValue(int)
setValue(std::string)
setValue(bool)

И у меня есть шаблонная функция, которая в идеале взяла бы любой из этих типов и передала бы его правильной функции setValue.

template <class T>
do_something(T value) {
...
setValue(value);

Но я получаю эту ошибку

error: call to member function 'SetValue' is ambiguous

Могу ли я что-нибудь сделать, чтобы обойти эту проблему, не копируя и не вставляя свой код для каждого типа, как пишут авторы setValue?

2

Решение

определив свой собственный SetValue с точным соответствием и перенаправив к правильной перегрузке.

void setValue(int i) { setValue(static_cast<double>(i)) }

или (если у вас много функций «setValue» одного типа), вы можете помочь компилятору выбрать, какую перегрузку использовать следующим образом:

void setValue(char a);
void setValue(double a);

template <typename T>
struct TypeToUseFor
{
typedef T type;
};

template <>
struct TypeToUseFor<int>
{
typedef double type;
};

template <class T>
void func(T value)
{
setValue(static_cast<typename TypeToUseFor<T>::type>(value));
//    setValue(value);
}

int main() {
func(0);   // int -> ?
func('0'); // exact match
func(0.0); // exect match
func(0.f); // float -> double

return 0;
}
0

Другие решения

У меня нет проблем с:

void setValue(int a)
{
}

void setValue(std::string a)
{
}

void setValue(bool a)
{
}

template <class T>
void func(T value)
{
setValue(value);
}

int main()
{
func(5);
}

Вот мой пробег: http://codepad.org/1wq8qd7l

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector