3

次のように記述された(ライブラリAPIなので、関数プロトタイプを変更できません)関数があります。

void FreeContext(Context c);

さて、私の実行のある瞬間に私はContext* local_context;変数を持っています、そしてこれも変更される可能性がありません。

boost::bind関数で使用したいのですが、ローカル変数FreeContextから取得する必要があります。ContextContext*

次のようにコードを書くと、コンパイラーはそれが「違法な間接参照」であると言います。

boost::bind(::FreeContext, *_1);

私はこの問題を次の方法で解決することができました。

template <typename T> T retranslate_parameter(T* t) {
   return *t;
}

boost::bind(::FreeContext,
            boost::bind(retranslate_parameter<Context>, _1));

しかし、この解決策は私にはあまり良くないようです。のようなものを使用してこれを解決する方法に関するアイデア*_1たぶん小さなラムダ関数を書いていますか?

4

3 に答える 3

4

*の演算子をオーバーロードしたBoost.Lambdaを使用できます_n

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>
#include <cstdio>

typedef int Context;

void FreeContext(Context c) {
    printf("%d\n", c);
}

int main() {
    using boost::lambda::bind;
    using boost::lambda::_1;

    Context x = 5;
    Context y = 6;
    Context* p[] = {&x, &y};

    std::for_each(p, p+2, bind(FreeContext, *_1));

    return 0;
}
于 2010-10-14T09:48:59.363 に答える
2

Boost.LambdaまたはBoost.Phoenixのいずれかを使用してoperator*、プレースホルダーを操作します。

于 2010-10-14T09:49:36.963 に答える
1

カスタム削除機能をContext使用して、ポインタをに配置することもできます。shared_ptr

#include <memory> // shared_ptr

typedef int Context;

void FreeContext(Context c)
{
   printf("%d\n", c);
}

int main()
{
   Context x = 5;
   Context* local_context = &x;

   std::shared_ptr<Context> context(local_context,
                                    [](Context* c) { FreeContext(*c); });
}

ただし、これが適切かどうかはわかりません。幸運を!

于 2010-10-14T09:56:36.157 に答える