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

  • Существует ли метод метапрограммирования, который, учитывая имя функции и набор типов аргументов, даст соответствующий тип возвращаемого значения функции?
  • Кроме того, есть ли другой метод, который я могу использовать, чтобы обернуть несколько перегрузок функции с универсальным объектом функции?

5

Решение

Вы можете кормить черты вручную для этого:

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; };
4

Другие решения


По вопросам рекламы [email protected]