Получить результат тип функции
-
09-10-2019 - |
Вопрос
Я хочу специализировать функцию шаблона, объявленную как:
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 ++, если я помню хорошо.