私はいくつかの奇妙な行動に遭遇しました。
このコードは私にエラーを与えます:
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 は型名を受け入れず、アドレスを受け入れます。