我编写了这段代码,它目前可以接受一个void回调并将一个值传递给它。但是,有什么办法可以让用户设置多个args吗?也许像Callback Caller这样的东西;而不是定义多个类型名称而不是回调?我能以某种方式将这一切都整合到一个类型名称中吗?
例如,这是我的班级
template <typename T>
class Callback
{
private:
std::vector<std::function <void (T)>> func;
public:
virtual void operator += (std::function<void (T)> _func)
{
func.push_back(_func);
}
};
我这样用:
Callback<int> Test;
如果我只想将一个参数传递给我的函数,它就可以了。但是,是否可以使用户能够定义多个值,而不必使用多个类型名称?
即
Callback< <(int, int, int)> > Test;
类似的东西?
答案 0 :(得分:13)
在C ++ 11中,使用可变参数模板:
template <typename... Ts>
// ^^^^^^ Parameter pack
class Callback
{
private:
std::vector<std::function <void (Ts...)>> func;
// ^^^^^
// Parameter pack expansion
public:
virtual void operator += (std::function<void (Ts...)> _func)
// ^^^^^
// Parameter pack expansion
{
func.push_back(_func);
}
};
现在您可以这样实例化您的课程:
Callback<int, int, int>
Callback<double, std::string>
Callback<bool>
Callback<>
...
答案 1 :(得分:1)
没有C ++ 0x,您可以使用boost::mpl::set
传递一组类型。
如果您需要参数的顺序,请使用boost::mpl::vector
。
有关详细信息,请参阅http://www.boost.org。