У меня есть функция 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
протокол для работы, а также. Короче:
Вы можете кормить черты вручную для этого:
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; };