1

名前付きパラメーターをコンストラクターに提供するために、Boost.Parameter ライブラリーを使用します。

BOOST_PARAMETER_NAME(windowFunction)

namespace detail
{

struct ClassAImpl
{
    template <class ArgumentPack>
    ClassAImpl(ArgumentPack const& args)
        : mWindowFun(args[_windowFunction])
            , [...]
    {

    }

    boost::function<bool(int, int)> mWindowFun;
    [...]
};
}

struct ClassA : detail::ClassAImpl
{
    BOOST_PARAMETER_CONSTRUCTOR(
            ClassA, (detail::ClassAImpl), tag
          , (optional (windowFunction,*)
            [...]))
};

通常windowFunctionはオブジェクトでコピーされるのboost::functionですが、 で参照渡しもできるようにしたいですboost::ref

boost::refただし、が削除された関数オブジェクトを渡すreference_wrapper<T>と、ArgumentPack にはT値への参照が含まれます。

質問:reference_wrapper<T>ラッパーの除去を防ぐ方法はありますか?

例:

SomeFunctionObject s;
ClassA a(windowFunction = boost::ref(s));

の代わりにのコンストラクターでに渡さSomeFunctionObject& sれます。したがって、コピーされることは望ましくありません。mWindowFunClassAImplconst reference_wrapper<SomeFunctionObject>&sboost::function

4

1 に答える 1

1

Boost Parameter が明示的に s をアンラップしているため、これは現在不可能のようreference_wrapperです。

これは、位置引数を参照渡しできるようにするために必要です。

于 2011-11-24T09:07:02.227 に答える