【问题标题】:Is there a way to handle a variable number of parameters in a template class?有没有办法在模板类中处理可变数量的参数?
【发布时间】:2010-09-14 08:43:06
【问题描述】:

我有一组回调类,用于处理带有可变数量参数的回调。现在我有大约 6 个不同的实例来处理不同数量的参数。有没有办法让一个实例能够处理可变数量的参数?最终,我希望每个参数都是 POD 类型或类指针或结构指针。有什么想法吗?

template <class T>
class kGUICallBackPtr
{
public:
    kGUICallBackPtr() {m_obj=0;m_func=0;}
    void Set(void *o,void (*f)(void *,T *));
    inline void Call(T *i) {if(m_func) m_func(m_obj,i);}
    inline bool IsValid(void) {return (m_func!=0);}
private:
    void *m_obj;
    void (*m_func)(void *,T *);
};


template <class T,class U>
class kGUICallBackPtrPtr
{
public:
    kGUICallBackPtrPtr() {m_obj=0;m_func=0;}
    void Set(void *o,void (*f)(void *,T *,U *));
    inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);}
    inline bool IsValid(void) {return (m_func!=0);}
private:
    void *m_obj;
    void (*m_func)(void *,T *,U *j);
};

【问题讨论】:

    标签: c++ parameters templates arguments


    【解决方案1】:

    语言本身还没有,但 C++0x 将支持variadic templates

    【讨论】:

      【解决方案2】:

      C++0x 变量模板是您最好的选择,但您也需要一段时间才能使用它们。

      如果您现在需要类型序列,请查看 MPL 的 vector 类型以及其他类型序列类型。它是Boost 库的一部分。它允许您提供一个类型序列的模板参数,而不仅仅是一个类型。

      【讨论】:

        【解决方案3】:

        通过使用Boost Bind 来回避这个问题怎么样?您可以让您的代码接受单个参数,或者根本不接受,并在调用站点绑定您需要的参数。

        【讨论】:

          【解决方案4】:

          我的第一选择是使用 boost::bind、boost::function 或 std::bind/std::function 和/或 c++11 lambda 来实现您的目标。但是,如果您需要滚动自己的仿函数,那么我将使用 boost fusion 创建一个带有单个模板参数的“融合仿函数”。

          http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

          最终,所有这些库都使用预处理器宏来枚举所有可能的选项,以解决缺少可变模板的问题。

          【讨论】:

            猜你喜欢
            • 2013-04-16
            • 1970-01-01
            • 2021-12-17
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 2018-06-18
            • 1970-01-01
            • 2022-06-15
            相关资源
            最近更新 更多