无论如何我可以制作模板<typename t =“”>接受多个值?</typename>

时间:2013-05-28 23:08:57

标签: c++ templates c++11

我编写了这段代码,它目前可以接受一个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;

类似的东西?

2 个答案:

答案 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