Получить тип результата функции - PullRequest
0 голосов
/ 10 января 2011

Я хочу специализировать шаблонную функцию, объявленную как:

template<typename Type> Type read(std::istream& is);

У меня тогда много статических реализаций

static int read_integer(std::istream& is);

a.s.o. Теперь я хотел бы сделать макрос, чтобы специализация чтения была такой простой:

SPECIALIZE_READ(read_integer)

Так что я решил пойти по пути boost :: function_traits и объявить SPECIALIZE_READ как:

#define SPECIALIZE_READ(read_function) \
   template<> boost::function_traits<read_function>::result_type read(std::istream& is) { \
      return read_function(is); \
   }

но компилятор VC ++ (2008) жалуется на: 'boost :: function_traits': 'read_integer' не является допустимым аргументом типа шаблона для параметра 'Function'

Идеи?

Ответы [ 2 ]

0 голосов
/ 10 января 2011

Насколько мне известно, нет механизма (кроме decltype в C ++ 0x) для получения типа возвращаемого значения из указателя функции без передачи того же указателя функции в качестве параметра.

Самый простой способ - принять дублирование типов возврата:

#define SPECIALIZE_READ(type, read_function) \
   template<> type read(std::istream& is) { \
      return read_function(is); \
   }

SPECIALIZE_READ(int, read_integer)
0 голосов
/ 10 января 2011

Может быть, я ошибаюсь, но если я хорошо помню, что я испытал во время моего носителя программирования C ++, функции не могут быть перегружены, если отличаются только типом возврата. Я думаю, что все будет работать, если вы сделаете это:

template<typename Type> void read(std::istream& is, Type& objectToRead);

И используйте Тип в качестве аргумента. Это связано с тем, как компиляторы обычно украшают имена c ++, если я хорошо помню.

...