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() が呼び出されるのはなぜですか?

このトピックに関するドキュメント:

ブースト::融合::ベクトル

ブースト::フュージョン::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::vectorNboost::fusion::vector<>

最初の関数は、NO 型の可変長ベクトルを受け入れます。したがって、要素は表示されません。2 番目のバージョンは、2 つのテンプレート タイプが宣言された可変長型を受け入れますが、(デフォルトのテンプレート タイプが開始されるため) 最初のタイプの方がよりよく一致するため、 を使用すると、2 番目のタイプよりも選択されますboost::fusion::make_vector。2 番目のケースのようにベクトルの型を定義すると、厳密な型が指定されているため、2 番目の関数と一致し、int 型と int 型の 2 つの要素が表示されます。

于 2011-05-05T14:51:36.700 に答える