2015-03-06 3 views
0

Mooing Duck делает комментарий here что «одна функция не может возвращать несколько типов. Однако вы можете специализировать или делегировать перегрузки, что отлично работает».Перегрузка шаблона по типу возврата

Я начал думать о том, что, и я пытаюсь выяснить, как это юридический код:

template <typename T> 
T initialize(){ return T(13); } 

При вызове:

auto foo = initialize<int>(); 
auto bar = initialize<float>(); 

ли не то, что переводить на 2 функции с одним и тем же именем, перегруженные только возвратным типом?

+4

Нет. Одна функция называется 'initialize ', а другая называется 'initialize '. –

+0

@JonathanMee Я имел в виду, что 'T initialize() {if (T == int) возвращает 0; if (T == string) return "HI";} 'не собирается летать. Одно тело функции не может иметь несколько типов. Чтобы сделать что-нибудь интересное, вам нужно использовать сложные трюки –

+0

@MooingDuck Ах, спасибо за разъяснение, я начинал удивляться. Да, я думаю, что поведение в любом случае противоречило бы всей идее «шаблона». Что-то вроде 'T initialize() {return T (13);}', вероятно, имеет смысл. –

ответ

5

Это не перегрузка, это специализация. Это разные механизмы (на самом деле их смешивание может привести к путанице, поскольку перегрузки разрешаются до того, как будут рассмотрены специализации - см. Статью Миллса Саттера, например: http://www.gotw.ca/publications/mill17.htm).

4

Вот пример запрещенного возвращаемого значения только от перегрузки:

int initialize(); 
float initialize(); 

OTOH, учитывая определение первичного шаблона

template <typename T> 
T initialize(){ return T(13);} 

Цитируя here

Для того, чтобы составить вызов функции, компилятор должен сначала выполнить поиск имени, который для функций может включать argum зависимый поиск, а для шаблонов функций может следовать вычет аргумента шаблона. Если эти шаги производят более одной кандидатской функции, то выполняется перегрузка разрешения для выбора функции, которая будет фактически вызвана.

initialize<int> и initialize<float> - это просто два разных экземпляра указанного шаблона. Они являются двумя различными функциями и не будут частью одного и того же списка потенциальных кандидатов на перегрузку.

Смежные вопросы