Boost logo

Boost Users :

Subject: [Boost-users] boost::optional with BOOST_FUSION_ADAPT_ADT broken?
From: Andrew (andrew_at_[hidden])
Date: 2014-02-27 08:21:51


There's an issue using get expressions returning optionals with
BOOST_FUSION_ADAPT_ADT, demonstrated in the simplest case below.
Optional<T> is trying initialize its internal T object using the
attribute proxy object returned by fusion, but this can only degrade
to optional<T> and not T, so the assignment fails. C++ wizard,
K-Ballo, took a quick look at this in #boost and seemed to suggest
it's the way op= is SFINAEd up for optional.

Does anyone have a work around for this?

#include <boost/optional.hpp>
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/algorithm/auxiliary/copy.hpp>

struct A {
    boost::optional<int> x;
};

struct B {
    boost::optional<int> y;
};

BOOST_FUSION_ADAPT_STRUCT(B, (boost::optional<int>, y))

BOOST_FUSION_ADAPT_ADT(A, (boost::optional<int>,
                           boost::optional<int>,
                           obj.x, obj.x = val))

int main() {
    A a;
    B b;
    // doesn't work:
    boost::fusion::copy (a, b);
    // this works:
    // boost::fusion::copy (b, a);
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net