Проблема с шаблоном функции без <> - PullRequest
1 голос
/ 31 марта 2011

Есть ли в любом случае, я могу сделать это без записи func2<int>();

int func() { return 5; }

template<class T>
T func2() { return func(); }


int main()
{
    auto k = func2();
    //auto k = func2<int>();

    return 0;
}

Ответы [ 5 ]

4 голосов
/ 31 марта 2011

Нет, поскольку аргумент шаблона не может быть выведен. Вам нужно указать его, как еще компилятор будет знать, чем его заменить? int? double? Пользовательский тип?
Редактировать
Если вы уже используете C ++ 0x (я полагаю, это из-за auto), вы можете использовать новый стиль функции конечного возвращаемого типа:

auto func2() -> decltype(func()) {
  return func();
}

decltype(func()) получит тип возврата func, фактически не вызывая его.
Edit2
Хорошо, вам даже не нужен конечный тип возврата, простой decltype тоже делает свою работу:

decltype(func()) func2() { return func(); }

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

2 голосов
/ 31 марта 2011

Возможно, вы ищете что-то подобное:

int func() { return 5; }

auto func2() -> decltype( func() )
{
  return func();
}

int main()
{
  auto k = func2();
}

Однако я не понимаю, почему вы сделали func2 шаблоном, поскольку вы всегда хотите, чтобы он возвращал int.Это может быть полезно, если вы хотите привести результат func к другому типу, но в этом случае вам нужно будет явно указать тип, который вы хотите вернуть.

1 голос
/ 31 марта 2011

Вы можете добиться этого синтаксиса с помощью c ++ 03 , если вы используете int вместо auto:

int func() { return 5; }

template<class T> T func2() { return func(); }


struct Inference {
    template<typename T> operator T () { return func2<T>(); }
};

int main() {
  int k = Inference();
}

EDIT: nvm, Konrad Rudolph ответ уже сказал это.

1 голос
/ 31 марта 2011

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

1 голос
/ 31 марта 2011

Нет, нет способа сделать это. Компилятор не может вывести аргумент шаблона, поскольку он не учитывает тип возвращаемого значения.

Если вы хотите смягчиться и использовать int k вместо auto k, тогда вы можете использовать «чит» для достижения той же цели, возвращая прокси-объект, который имеет неявное преобразование в имя типа T.

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