Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> result_of функтора из шаблона 
V
    Опции темы
borisbn
Дата 28.1.2013, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Здравствуйте!
Следующий код
Код
template< class F >
auto foo( F f ) -> typename std::result_of< F >::type {}

void some(){}

int main() {
   foo( some );
}

выдаёт ошибку
Цитата
error: no matching function for call to 'foo(void (&)())'
invalid use of incomplete type 'class std::result_of<void (*)()>'

заменить определение ф-ции foo на такое
Код
template< class F >
auto foo( F f ) -> decltype( f() ) {}

нельзя, т.к. в вызове f() могут быть параметры. Дело в том, что ф-ция foo сама с f ничего не делает, а передаёт "дальше" и ей не нужно знать о наличии и количестве аргументов.
Подскажите, пожалуйста, как при помощи std::result_of (или м.б. std::function) узнать тип возвращаемого значения функтора f.
Спасибо.

http://liveworkspace.org/code/vd5op$16 <--- самый простой вариант, который не работает
http://liveworkspace.org/code/vd5op$19 <--- вариант, который мне, собственно, нужен


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.1.2013, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  28.1.2013,  13:14 Найти цитируемый пост)
нельзя, т.к. в вызове f() могут быть параметры. Дело в том, что ф-ция foo сама с f ничего не делает, а передаёт "дальше" и ей не нужно знать о наличии и количестве аргументов.

 smile 

Цитата(borisbn @  28.1.2013,  13:14 Найти цитируемый пост)
самый простой вариант, который не работает

забыты скобки..

Цитата(borisbn @  28.1.2013,  13:14 Найти цитируемый пост)
вариант, который мне, собственно, нужен 

http://liveworkspace.org/code/3Wb7bl$3




--------------------
PM MAIL WWW   Вверх
borisbn
Дата 28.1.2013, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  28.1.2013,  18:24 Найти цитируемый пост)
забыты скобки..

я не забыл, а убрал их, т.к. если сделать так
Код
auto foo( F f ) -> typename std::result_of< F() >::type {}

то тогда нельзя будет сделать так
Код
void some( int /* <------- */ );
foo( some );


по поводу второго варианта: мне не нужно вызывать f( ff() ), мне нужно передать их "дальше". Дело в том, что ff может быть объявлена как void some(); и тогда эта конструкция
Код
result_of< F( decltype( ff() ) ) >

работать не будет.

В общем-то я уже сделал по-другому и всё заработало, но захотелось узнать, можно ли при помощи result_of вытащить return_type функтора, про аргументы которого ничего не известно...

Добавлено через 4 минуты и 29 секунд
Может как-то class ... Args заюзать... вроде ж они могут быть пустыми... Я работу с вариадиками ещё плохо знаю

Это сообщение отредактировал(а) borisbn - 28.1.2013, 18:42


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.1.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата

мне нужно передать их "дальше"

непонятно, что есть "дальше" ..вполне возможно, что  у него и надо спрашивать о возвращаемом типе..

Цитата(borisbn @  28.1.2013,  17:39 Найти цитируемый пост)
 при помощи result_of вытащить return_type функтора, про аргументы которого ничего не известно

учитывая, что  функтор может иметь от нуля до множества операторов(), каждый со своим возврящаемым типом, непонятно, чего вообще должна узнавать result_of в таком случае..

Цитата(borisbn @  28.1.2013,  17:39 Найти цитируемый пост)
 можно ли 

если функтор соответствует концепции функтора, то по хорошему у него дожно быть result_type 


Цитата(borisbn @  28.1.2013,  17:39 Найти цитируемый пост)
Может как-то class ... Args заюзать... вроде ж они могут быть пустыми...

пустыми могут.. но пока непонятно зачем нужна ваша "прокся" ..

Это сообщение отредактировал(а) mes - 28.1.2013, 19:27


--------------------
PM MAIL WWW   Вверх
volatile
Дата 28.1.2013, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



А если так:
Код

// где нибудь повыше...
template <typename F, typename FF>
struct result_type
{ typedef typename std::result_of <F (typename std::result_of <FF()>::type)>::type type; };

template <typename F>
struct result_type <F, void (*)()>
{ typedef typename std::result_of <F ()>::type type; };

// ------------------------------------------------
// ваша функция начинаецца здесь:
template <typename F, typename FF>
auto foo (F f, FF ff) -> typename result_type <F,FF>::type 
{
   // ...
}

Если ничо не напутал, то вроде удовлетворяет условиям озвученным во второй вашей ссылке LWS
Цитата(borisbn @  28.1.2013,  14:14 Найти цитируемый пост)
вариант, который мне, собственно, нужен 



Это сообщение отредактировал(а) volatile - 28.1.2013, 23:59
PM MAIL   Вверх
volatile
Дата 29.1.2013, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(volatile @  28.1.2013,  23:58 Найти цитируемый пост)
удовлетворяет условиям озвученным во второй вашей ссылке 

Это то да, только там есть одна засада.
Оно не будет работать с функц.объектами, только с функциями.
Вот это будет работать и тем и с другим:

Код

template <typename F, typename T>
struct result_type
{ typedef typename std::result_of <F(T)>::type type; };

template <typename F>
struct result_type <F, void>
{ typedef typename std::result_of <F()>::type type; };

// ваша функция начинаецца здесь:
template <typename F, typename FF>
auto foo (F f, FF ff) -> typename result_type <F, typename std::result_of <FF()>::type>::type
{
   // ...
}

PM MAIL   Вверх
borisbn
Дата 29.1.2013, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  28.1.2013,  18:52 Найти цитируемый пост)
вполне возможно, что  у него и надо спрашивать о возвращаемом типе..

так и сделал))

Цитата(mes @  28.1.2013,  18:52 Найти цитируемый пост)
если функтор соответствует концепции функтора, то по хорошему у него дожно быть result_type 

тогда нельзя просто функцию подставить

Цитата(volatile @  29.1.2013,  03:39 Найти цитируемый пост)
Вот это будет работать и тем и с другим:

хммм... заманчиво. спасибо.

Цитата(mes @  28.1.2013,  18:52 Найти цитируемый пост)
 пока непонятно зачем нужна ваша "прокся" ..

вот такую штуку хотел замутить - http://liveworkspace.org/code/3eIS41$0
сначала думал чтобы run в trailing return возвращал тип, возвращаемый Waiter'ом, но потом понял, что
Цитата(mes @  28.1.2013,  18:52 Найти цитируемый пост)
вполне возможно, что  у него и надо спрашивать о возвращаемом типе..

))

Всем спасибо. Закрываю.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.