LINUX.ORG.RU

Магия шаблонов

 , ,


0

1

Привет. Есть вот такая функция:

void executeRequest(boost::function0<void> func);
которая используется как:

myHelper.executeRequest(boost::bind(&myClass::method), myClassObj);

Подскажите, как мне её в шаблон возвращаемое значание перевести, чё-то не получается. Пробую вот так вот:

template<typename T> T executeRequest(boost::function0<T> func);
но при вызове ругаецо, что функцию найти не может. Спасибо.

★★★★★

Может объявить так?

template<> void executeRequest<void>(boost::function0<void> func);

four_str_sam
()
template<typename F>
auto executeRequest(F f) -> decltype(f())
{
}
Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от shty

Так это ж идентично тому, что я пробую. Если я вызываю вот так:

myHelper.executeRequest(boost::bind<std::string>(&myClass::method), myClassObj);
То получаю

error: no matching function to call...

UVV ★★★★★
() автор топика
Ответ на: комментарий от Kuzy

Короче ошибка была в том, что я в функции шаблонной тип не указал. Нужно вот так:

myHelper.executeRequest<std::string>(boost::bind(&myClass::method), myClassObj);

UVV ★★★★★
() автор топика
Ответ на: комментарий от shty

Да, просто привычка по возможности его использовать.

Begemoth ★★★★★
()
Ответ на: комментарий от UVV

Если нужен С++03, то boost::result_of или, что проще boost::function<S>::result_type.

Begemoth ★★★★★
()

В текущем стандарте используй decltype - проще некуда. Если используете старый стандарт, то ищите в разных библиотеках typeof/resultof/etc., например в boost. Ну или воспользоваться средствами компиляторов, в духе gcc typeof.

P.S. это еще не шаблонная магия =)

anonymous
()
Ответ на: комментарий от anonymous

Да вроде не проблема. Для расширения кругозора, как бы это можно было сделать с resultof? Я что-то не разобрался.

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.