当对象是可变模板参数时,如何调用成员函数
how to call member functions when the objects is variable template parameters
当对象是变量模板参数时,如何调用成员函数?这是一个例子:
template <typename ...A>
void f(A... args)
{
args->memfunc("examples")...; // the code not right!
}
如何做对吗?
这很棘手。参数包只能在某些情况下扩展。您不能只编写扩展它的语句(没有C 17倍表达式)。通常的技巧涉及使用虚拟阵列初始化器(这是具有定义定义的评估顺序的可能上下文):
int dummy[] = { // Expand it in the initializer
(void(args->memfunc("examples")), 0)...
};
我们不想强制所有成员的特定返回类型。因此,我们使用逗号运算符(..., 0)
来创建一个始终具有int
类型的表达式。但是,由于运算符可以超载,我们需要将功能调用的结果施加到void,以确保我们使用内置的函数。因此,我们扩展的表达最终是您所看到的。
在C 17中,您可以使用折叠表达式:
template <typename ...A>
void f(A... args)
{
(..., args->memfunc("examples")); // the code not right!
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Singleton模式中的手动析构函数调用:调用多次
- 从同一父调用调用不同的子类函数
- 我可以通过CPP程序中的数据库调用调用Java程序
- C++17标准对在nullptr上调用delete有何规定
- NSIS系统::调用-调用方法失败
- 参数构造函数调用调用
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 关于在矢量上调用clear如何改变容量,标准有何规定
- 如何让函数调用调用它的函数
- 如何p/调用调用函数只使用,但c++需要.a/.lib/.o文件
- C#DLL可以调用调用本机C++静态库的C++/CLI托管包装器吗