0

私は次のことをしたいと思います。私がこれを持っているとしましょう:

void f(const char* c) {
    // Do stuff with c
}

void g(const char* c, int x, int y) {
    // Do other stuff
}

私がやりたいことは、g から const char* c を取る関数を作成することです。あれは:

int a = 5;
int b = 9;
expression(g, a, b)("Hi!");

できれexpression(g)ば、変数にも格納できます。この変数を宣言する方法もわかりません。

boost::bind; を使用してみました。ただし、boost::bind は boost::function を返します。通常の C++ 関数ポインターが必要です。さらに、このスレッドも見ました: demote boost::function to a plain function pointer And top 2つの解決策はどちらも機能しません。私の関数 f は、1 つのパラメーターを取るように制約されています (void* user_data ポインターはありません)。これが必要な理由は、引数が 1 つの関数、つまり const char* を受け取り、それを処理する 3 番目の関数 h があるためです。g から h の形で渡せるようにしたいです。

h(f) // Valid
h(expression(g, a, b)) // Would like for this to be valid, too

これが可能かどうかはわかりませんが、可能であれば教えてください:)。

4

1 に答える 1

2

使用bind:

#include <functional>

auto h = std::bind(g, std::placeholders::_1, 5, 9);

h("hi");

bindは引数のコピーを作成するため、参照によって引数を取ることを計画している場合は注意してください (その場合は が必要になる場合がありますstd::ref)。auto不必要な変換を避けるために、結果の型を保持するようにしてください。


通常の C++ 関数を取得するには:

void h(char const * s) { g(s, 5, 9); }

または:

void (*ph)(char const *) = [](const char * s) { g(s, 5, 9); };

または非常識な場合:

struct Foo { static void bar(char const * s) { g(s, 5, 9); } };
void (*qh)(char const *) = &Foo::bar;

使用法:

h("hi");
ph("hi");
Foo::bar("hi");
qh("hi");
于 2013-02-14T01:47:05.043 に答える