1

私はいくつかの奇妙な行動に遭遇しました。

このコードは私にエラーを与えます:

struct Game {
    void stop() {std::cout << "success\n";}
};

template<class ...Args>
struct holder {
    std::map<std::string, std::function<void(Args...)>> funcMap;

    template <typename T, typename U>
    void connect(T* targObj, const std::string& funcName) {
        std::function<void(Args...)> newFunc = std::bind(U, targObj); 
        //expected primary expression before ',' token on line above
        funcMap[funcName] = newFunc;
    }

    void invoke(const std::string& funcName, class Args...Vals) 
    {funcMap[funcName](Vals...);}
};

int main() {
    holder<> h;
    Game g;
    h.connect<Game, &Game::stop>(g, "close");
    h.invoke();
}

入力として型名が好きでstd::bindはないようです。これに対する回避策はありますか? 同じパラメーターを手動で使用std::bindしても問題なく動作しますが、定型コードになります。

std::function<void(Args...)> newFunc = std::bind(&ae::Game::stop, targObj);

入力がなくても、コンパイル時にエラーが発生します。機能が動作しないのはなぜですか?

編集:助けてくれてありがとう。結局のところ、bind は型名を受け入れず、アドレスを受け入れます。

4

3 に答える 3