【问题标题】:Is there anyway I can make a template<typename T> accept multiple values?无论如何我可以让模板<typename T> 接受多个值吗?
【发布时间】:2013-05-28 23:08:56
【问题描述】:

我写了这段代码,它目前可以接受一个 void 回调并向它传递一个值。但是,有什么方法可以让用户能够设置多个参数?也许像 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;

类似的东西?

【问题讨论】:

  • 值得一提的是,您可以在 C++11 中使用 emplace_back 而不是 push_back 来构建它。

标签: c++ templates c++11


【解决方案1】:

在 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<>
...

【讨论】:

  • 谢谢,完美运行。我将阅读有关包装参数的信息以了解更多信息。
  • @Jason:好的,很高兴我能帮上忙。如果这回答了您的问题,请考虑在系统允许时将答案标记为已接受:)
【解决方案2】:

如果没有 C++0x,您可以使用 boost::mpl::set 传递一组类型。 如果您需要参数的顺序,请使用boost::mpl::vector

更多详情请见http://www.boost.org

【讨论】:

    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多