Как обернуть множественные перегрузки функций универсальным функциональным объектом TR1?
У меня есть функция foo()
это предоставляется в контексте библиотеки. Библиотека определяет несколько перегрузок для этой функции, например:
char foo(float x, int y);
short foo(double x, char y);
(Я описал вышеупомянутые типы аргументов / результатов. Вывод заключается в том, что между типами аргументов и соответствующим возвращаемым типом перегрузки нет общих отношений.)
Идея состоит в том, что пользователь библиотеки может добавить перегрузки для foo()
для их собственных пользовательских типов по мере необходимости. Перегрузка функций выполняет это очень легко.
Я хотел бы сделать foo()
семейство функций, используемых в выражении Boost.Proto. Для этого, я думаю, мне нужно обернуть вышеупомянутое в объект функции с помощью оператора вызова шаблона:
struct foo_wrap
{
template <typename A1, typename A2>
result_type operator()(A1 a1, A2 a2) { return foo(a1, a2); }
};
Проблема заключается в том, как определить result_type
, Я понимаю, что это будет легко с C++11 и decltype()
и завершающие типы возвращаемых функций, но я ищу решение C++03. Следовательно, foo_wrap
должен быть функциональным объектом в стиле TR1. Мне нужно найти способ определить result_type
как функция времени компиляции типов аргументов A1
а также A2
, Это нужно не только для типа возврата operator()
, но и для TR1 result_of
протокол для работы, а также. Короче:
- Существует ли метод метапрограммирования, который, учитывая имя функции и набор типов аргументов, даст соответствующий тип возвращаемого значения функции?
- Кроме того, есть ли другой метод, который я могу использовать, чтобы обернуть несколько перегрузок функции с универсальным объектом функции?
1 ответ
Вы можете кормить черты вручную для этого:
template <typename A1, typename A2>
struct foo_wrap_result;
с
struct foo_wrap
{
template <typename A1, typename A2>
typename foo_wrap_result<A1, A2>::type
operator()(A1 a1, A2 a2) const { return foo(a1, a2); }
};
И специализация черт:
template <>
struct foo_wrap_result<float, int> { typedef char type; };
template <>
struct foo_wrap_result<double, char> { typedef short type; };