Ошибка перегрузки функции - PullRequest
1 голос
/ 05 мая 2011

Я не могу понять, почему код ведет себя так?

#include <iostream>

#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/container/vector/vector_fwd.hpp>
#include <boost/fusion/include/vector_fwd.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <boost/fusion/sequence/io.hpp>
#include <boost/fusion/include/io.hpp>

template<typename Ar>
void func(Ar& ar, const boost::fusion::vector<>& v) {
   std::cout << v << std::endl;
}

template<typename Ar, typename T0, typename T1>
void func(Ar& ar, const boost::fusion::vector<T0, T1>& v) {
   std::cout << v << std::endl;
}

struct type {
   template<typename T>
   type& operator& (const T& v) {
      func(*this, v);
      return *this;
   }
};

int main() {
   type t;
   t & boost::fusion::make_vector(33,44); // 1. <<<<<<<<<<<<<<<<<<<<<<<<

   boost::fusion::vector<int, int> v(55,66); // 2.
   t & v;
}

тестовый код здесь

Вопрос в том, почему в первом случае функция() для пустого вектора вызывается?

Документация по этой теме:

boost :: fusion :: vector

boost:: fusion :: make_vector ()

Спасибо.

1 Ответ

3 голосов
/ 05 мая 2011

Это примерно то, что я понимаю ...

boost::fusion::make_vector() от вашего использования boost::fusion::make_vector(33,44) возвращает тип boost::fusion::vector2<int, int>, а НЕ тип boost::fusion::vector<int, int, T2, T3,...> (variadic). Однако boost::fusion::vectorN типы могут преобразовываться в boost::fusion::vector<> (variadic) тип.

Первая функция принимает переменный вектор типа NO. Следовательно, элементы не отображаются. Вторая версия принимает тип variadic с двумя объявленными типами шаблонов, однако, так как первый соответствует лучше (потому что типы шаблонов по умолчанию включаются), он выбирается поверх второго, когда вы используете boost::fusion::make_vector. Когда вы определяете тип вектора, как во втором случае, для него указывается строгий тип, и, следовательно, он соответствует второй функции и отображает два элемента типа int и int.

...