std::bind
错误的方式,例如
std::function<void(std::vector<int>)> funcA = std::bind(foo<int>, a);
你已经约束了这个论点
a
foo<int>
funcA
不会生效,以上等同于
std::function<void()> funcA = std::bind(foo<int>, a);
为了简化代码,如果你想坚持
标准::绑定
MyClass
所有注册的
std::function
template<typename T>
class MyClass {
private:
std::vector<std::function<void()>> myFuncs_;
public:
MyClass() = default;
template <class... F, std::enable_if_t<(sizeof...(F) > 0), bool> = true>
void addFunc(F&&... func) {
((myFuncs_.push_back(std::forward<F>(func))), ...);
}
void operator()() const {
for (auto& fn : myFuncs_) {
fn();
}
}
};
auto funcA = std::bind(foo<int>, a);
auto funcB = std::bind(bar<int>, b);
myClass.addFunc(funcA, funcB);
myClass();
使用同样的方法,你可以随时切换到lambdas。