有没有办法处理模板类中可变数量的参数
Is there a way to handle a variable number of parameters in a template class?
我有一组回调类,用于处理具有可变参数数量的回调。现在我有大约 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++0x 将支持可变参数模板。
C++0x 可变模板是您最好的选择,但您还需要一段时间才能使用它们。
如果您今天需要类型序列,请查看 MPL 的类型向量以及其他类型序列类型。 它是 Boost 库的一部分。 它允许您提供作为类型序列的模板参数,而不仅仅是单个类型。
通过使用 Boost Bind 来回避这个问题怎么样? 您可以使代码接受单个参数,或者根本不接受任何参数,并在调用站点绑定所需的参数。
我的第一选择是使用 boost::bind、boost::function 或 std::
bind/std::function 和/或 c++11 lambda 来实现你的目标。 但是,如果您需要滚动自己的函子,那么我将使用boost融合来创建采用单个模板参数的"融合函子"。
http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html
最终,所有这些库都使用预处理器宏来枚举所有可能的选项,以解决缺少varidic模板的问题。
相关文章:
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 如何编写具有相同名称的相同函数,该函数在C++中几乎以相似的方式处理不同的类参数?
- 为什么这个噪声函数不处理否定参数?
- 容器如何处理 lambda 表达式的参数
- 处理一般情况混合类型和非类型的可变参数模板
- 如何在 c++ 窗口中将参数和返回的退出值传递到批处理文件/从批处理文件获取返回的退出值
- C++17.处理使用 auto 相关的模板参数.代码排序困难
- 使用qprocess将参数传递给批处理
- 专门处理一个参数(C++模板)的两个模板参数
- 编译器如何处理<Type> <Type> 具有多参数的向量initializer_list
- 当 C++ 中函数参数的输入类型(类)错误时的错误处理
- 在处理之前评估宏参数
- 如何处理C++98中不同类型的多个参数?
- 有没有办法帮助编译器处理复杂的参数推导?
- 如何处理模棱两可的模板参数
- 将不同类型的多种参数发送到处理方法的最佳方法.C
- 巩固大量参数处理的干净方法是什么
- 通过c++主字符**参数处理不同字符串编码的正确方法是什么
- 当函数指向一个函数时,如何将函数作为参数处理
- 为什么我的命令行参数处理崩溃我的程序