Вопрос

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

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

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

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

ASO Теперь я хотел бы сделать макрос, чтобы специализация чтения так же просто, как:

SPECIALIZE_READ(read_integer)

Поэтому я подумал, что я пойду на усиление :: Function_traits Way и объявить Specialize_Read AS:

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

Но Compiler VC ++ (2008) жалуется: «Boost :: Function_traits»: «read_integer» не является действительным аргументом типа шаблона для параметра «Функция»

Идеи?

Это было полезно?

Решение

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

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

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

SPECIALIZE_READ(int, read_integer)

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top