5

のブーストフェニックスレイジーバリアントを作成することは可能std::make_sharedですか? つまり、次のようなことを可能にするために

namespace p = boost::phoenix;
...
expr = custom_parser[_a=p::make_shared<Node>(_1,_2,_3)] >> ...

BOOST_PHOENIX_ADAPT_FUNCTIONの可変個引数テンプレートの性質のため、使用できませんstd::make_shared。したがって、ラッパーを作成できる場合は、おそらくラッパー自体が可変個引数テンプレートである必要があります。

4

2 に答える 2

5

追加の括弧を割ける場合:

namespace {
    template <typename T>
    struct make_shared_f
    {
        template <typename... A> struct result 
            { typedef boost::shared_ptr<T> type; };

        template <typename... A>
        typename result<A...>::type operator()(A&&... a) const {
            return boost::make_shared<T>(std::forward<A>(a)...);
        }
    };

    template <typename T>
    using make_shared_ = boost::phoenix::function<make_shared_f<T> >;
}

次のように使用できます

typedef std::vector<int> IntVec;
auto LazyInts = make_shared_<IntVec>()(arg1, arg2);

// create a shared vector of 7 ints '42'
auto ints = LazyInts(7, 42);
for (auto i : *ints) std::cout << i << " ";

Coliruでライブを見る

于 2014-02-04T22:59:12.233 に答える