Здравствуйте, kov_serg, Вы писали:
C>>Как сделать, чтобы примерно такой код компилировался?
C>>void reset(T(&x)[sz] ) _>поменяйте на _>void reset(T x[sz])
Только вот компилироваться код станет только лишь потому, что эта функция никогда не выиграет конкурс на подстановку. Просто потому, что шаблонный параметр sz не может быть выведен автоматически — просто потому, что параметры-массивы автоматом интерпретируются компилятором как указатели. И все по стандарту.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, collider, Вы писали:
C>Как сделать, чтобы примерно такой код компилировался?
Решения можно придумать разные, в зависимости от ситуации. Классика жанра — реализация одной шаблонной функции через серию специализаций шаблонного класса-имплеиентации.
У вашего кода две проблемы:
1) Объявлены три разных шаблона методов, соответственно если несколько из них подходят, то получается ошибка с двумя перегруженными методами, а не выбор подходящего.
2) ссылка на указатель не разбирается
C>>Как сделать, чтобы примерно такой код компилировался?
R>Решения можно придумать разные, в зависимости от ситуации. Классика жанра — реализация одной шаблонной функции через серию специализаций шаблонного класса-имплеиентации.
R>Или SFINAE:
R>http://ideone.com/2dKajZ
Никогда не понимал желания сделать простую задачу сложным способом
Все можно сделать на обычных перегрузках функций: http://rsdn.org/forum/cpp/6687345.1
Здравствуйте, Andrew S, Вы писали:
R>>Или SFINAE:
R>>http://ideone.com/2dKajZ
AS>Никогда не понимал желания сделать простую задачу сложным способом AS>Все можно сделать на обычных перегрузках функций: AS>http://rsdn.org/forum/cpp/6687345.1
Здравствуйте, Andrew S, Вы писали:
AS>Никогда не понимал желания сделать простую задачу сложным способом AS>Все можно сделать на обычных перегрузках функций:
А если внимательно почитать стартовое сообщение:
Как сделать, чтобы примерно такой код компилировался?
то "примерно такой", имхо, следует понимать не иначе как "такой, когда обычные перегрузки не работают". Я, по крайней мере, именно такую трактовку выбрал в качестве отправной точки.
--
Справедливость выше закона. А человечность выше справедливости.
NB>я, конечно, извиняюсь, но ты вывод своей программы смотрел?
Не вопрос — уберите const или добавьте в другие перегрузки, смотря от того, что надо. Судя по сигнатурам, надо убрать. В целом, идея иметь именно такие перегрузки для меня сомнительна.
AS>>Никогда не понимал желания сделать простую задачу сложным способом AS>>Все можно сделать на обычных перегрузках функций:
R>А если внимательно почитать стартовое сообщение:
R>
R>Как сделать, чтобы примерно такой код компилировался?
R>то "примерно такой", имхо, следует понимать не иначе как "такой, когда обычные перегрузки не работают". Я, по крайней мере, именно такую трактовку выбрал в качестве отправной точки.
Судя по приведенному коду у человека стандартная задача — дискриминировать указатель от массива. Лучше, чем в буст-рендже, я пока решения не видел. Навороты типа SFINAE для решения этой задачи не нужны.
Здравствуйте, Andrew S, Вы писали:
AS>Не вопрос — уберите const или добавьте в другие перегрузки, смотря от того, что надо. Судя по сигнатурам, надо убрать.
То есть, указатель можно будет передать только по неконстантной ссылке? Очень удобно, спасибо.
AS>В целом, идея иметь именно такие перегрузки для меня сомнительна.
А как же буст-рендж? Там же эта задача зачем-то решается, как ты утверждаешь?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Andrew S, Вы писали:
AS>Судя по приведенному коду у человека стандартная задача — дискриминировать указатель от массива. Лучше, чем в буст-рендже, я пока решения не видел. Навороты типа SFINAE для решения этой задачи не нужны.
Ну так ты доведи сперва свое решение до рабочего состояния, а потом уже делай заключения. И, скажу сразу, необходимость передачи указателя по неконстантной ссылке — решение так себе.
И, кстати, что-то не припоминаю я в boost::range места, где требуется решение такой задачи. Там либо указателей будет пара (begin, end), либо разница между указателем и массивом несущественна. Не назовешь имя класса?
--
Справедливость выше закона. А человечность выше справедливости.