Рекурсивно показывать членов базового класса - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь написать класс, который принимает в качестве аргумента кортеж функций и перегружает operator() для всех argument_type функций.Прямо сейчас это выглядит так:

template<typename T>
struct holder {
  T t;
};

template<typename T, std::size_t i>
struct overload_helper : public holder<T>, public overload_helper<T, i - 1> {
  overload_helper(T t) : holder<T>({t}) {};
  typedef typename std::tuple_element<i - 1, T>::type inner_type;
  typename inner_type::result_type operator()(typename inner_type::argument_type x) { 
    return std::get<i - 1>(holder<T>::t)(x); }
};

template<typename T>
struct overload_helper<T, 1> {
  typedef typename std::tuple_element<0 ,T>::type inner_type;
  typename inner_type::result_type operator()(typename inner_type::argument_type x) { 
    return std::get<0>(holder<T>::t)(x); }
};

template<typename T>
struct overload : public overload_helper<T, std::tuple_size<T>::value>
{
  typedef void result_type;
  overload(const T& t) : overload_helper<T, std::tuple_size<T>::value>(t) { }
};


int main() {
  auto all = make_overload(std::make_tuple(
                 std::function<void(double)>([](double i) { 
                 std::cout << "double" << std::endl;
                   }), std::function<void(int)>([](int i) { 
                   std::cout << "int" << std::endl; })));

  all(1); //fails
  all(1.0);
}

Проблема в том, что базовый класс скрывает каждое рекурсивное определение operator().Можно ли рекурсивно отобразить все определения с помощью using или это единственный способ получить шаблон operator() и выбрать правильную перегрузку с помощью boost::mpl?

1 Ответ

6 голосов
/ 20 июня 2011

using overload_helper<T, i - 1>::operator() в каждом overload_helper должны выполнять работу, пока они не являются двусмысленными.

...