1

我不明白为什么代码会这样?

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

测试代码在这里

问题是,为什么在第一种情况下调用空向量的 func() ?

关于此主题的文档:

boost::fusion::vector

boost::fusion::make_vector()

谢谢。

4

1 回答 1

3

这大概是我理解的...

boost::fusion::make_vector()从您的使用boost::fusion::make_vector(33,44)返回一个boost::fusion::vector2<int, int>类型而不是boost::fusion::vector<int, int, T2, T3,...>(可变参数)类型。boost::fusion::vectorN但是 types 可以将自身转换为boost::fusion::vector<>(可变参数)类型。

第一个函数接受 NO 类型的可变参数向量。因此不显示任何元素。第二个版本接受声明了两个模板类型的可变参数类型,但是由于第一个匹配更好(因为默认模板类型启动),当您使用boost::fusion::make_vector. 当您在第二种情况下定义向量的类型时,它指定了强类型,因此匹配第二个函数并显示两个 int 和 int 类型的元素。

于 2011-05-05T14:51:36.700 回答