peter_foelsche wrote:
This code does not compile. I'm using Visual C++. Any help would be appreciated.
I'm still quite unclear as to what you're trying to accomplish, but the following compiles: #include <utility> #include <boost/mpl/placeholders.hpp> #include <boost/mpl/back.hpp> #include <boost/mpl/for_each.hpp> #include <boost/mpl/front.hpp> #include <boost/mpl/or.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/zip_view.hpp> #include <boost/noncopyable.hpp> namespace mpl = boost::mpl; template<typename T> struct wrap { }; template<typename CDB> struct CDer { }; template<typename CDB, typename CDB1> struct CMyOperation : private boost::noncopyable { typedef CDer < typename mpl::transform<CDB, CDB1, mpl::or_<mpl::_1, mpl::_2> >::type > CDerOr; CMyOperation(CDer<CDB> const& r0, CDer<CDB1> const& r1, CDerOr& rT) : m_r0(r0), m_r1(r1), m_rT(rT), m_iPos(0) { } void operator ()(std::pair<bool, bool> const&) { ++m_iPos; } private: CDer<CDB> const& m_r0; CDer<CDB1> const& m_r1; CDerOr& m_rT; unsigned m_iPos; }; template<typename CDB, typename CDB1> struct CCreatePair { CCreatePair(CMyOperation<CDB, CDB1>& op) : m_sOp(&op) { } typedef void result_type; template<typename T> void operator ()(wrap<T>) const { typedef typename mpl::front<T>::type first; typedef typename mpl::back<T>::type second; (*m_sOp)(std::make_pair(first::value, second::value)); } private: CMyOperation<CDB, CDB1>* m_sOp; }; template<typename CDB, typename CDB1> typename CMyOperation<CDB, CDB1>::CDerOr myOperation(CDer<CDB> const& _r0, CDer<CDB1> const& _r1) { typedef mpl::zip_view<mpl::vector<CDB, CDB1> > CMerged; typename CMyOperation<CDB, CDB1>::CDerOr sRet; CMyOperation<CDB, CDB1> sOp(_r0, _r1, sRet); CCreatePair<CDB, CDB1> createPair(sOp); mpl::for_each<CMerged, wrap<mpl::_1> >(createPair); return sRet; } int main() { CDer<mpl::vector<mpl::true_, mpl::true_> > sDer0; CDer<mpl::vector<mpl::false_, mpl::true_> > sDer1; myOperation(sDer0, sDer1); return 0; }