БЕЗОПАСНЫЕ ВАРИАНТНЫЕ ФУНКЦИИ С ПАРАМЕТРАМИ - PullRequest
5 голосов
/ 23 марта 2012

Я хочу использовать безопасные с точки зрения типов переменные функции, представленные в C ++ 11, но не с разными типами Пример:

template<typename T>
T maxv(T first, T second) {
  return first > second ? first : second; 
}

template<typename T, typename ... Rest>
T maxv(T first, T second, T ... rest) {
  return maxv(first, maxv(second, rest));
}

Тип всех параметров одинаков, поэтому возможно написать что-то вроде этого:

struct Point { int x,y; };  

template<>
Point maxv(Point first, Point second) {
  return first.x > second.x ? first : second; 
}  

maxv({1, 2}, {3, 4});         // no problem    
maxv({1, 2}, {3, 4}, {5, 6}); // compile error

Компилируется с этой ошибкой в ​​mingw g ++ 4.5:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)'

Потому что он не знает, что {5, 6} имеет тип Point. Какое решение?

1 Ответ

10 голосов
/ 23 марта 2012

Решением является , а не для использования шаблонов с переменными параметрами!При использовании с шаблонами функций они предназначены для определения типов аргументов.Это не то, что вы хотите сделать: вы хотите, чтобы аргументы принимали ожидаемый тип.

У меня нет большого практического опыта с этим, но вы бы хотели использовать списки инициализатора для этого:

Point maxv(std::initializer_list<Point> list) {
    ...
}

Вы можете жаловаться, что не можете использовать это с произвольными типами, но тогда вам нужно понять, что вам нужно где-то указать, какой тип задействован.... И это можно сделать шаблоном, хотя вам необходимо указать тип аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...