用给定的类型和构造函数参数创建和销毁临时函数的c++函数
C++ function to create and destroy temporary with given type and constructor parameters
我发现我的代码中有很多如下内容:
{
SomeClass<VisitorType> obj(visitor, param1, param2, 3, 4);
}
{
OtherClass<VisitorType> obj(visitor, 5, "six");
}
大括号是必要的,以确保对象的生命周期是受限的,工作是在构造函数和析构函数(RAII风格)中完成的。这是有充分理由的,而且这些类模板的其他用户做的不仅仅是构造和析构。
是否有一种方便的习语将其归结为类似于函数调用的东西,在可能的情况下保留强类型?
。
f<SomeClass>(visitor, param1, param2, 3, 4);
f<OtherClass>(visitor, 5, "six");
其中f<>()
类似于:
template <template <class> class C, class V>
void f(V &v, ...)
{
C<V> c(v, ...); // magic needed here
}
我尝试使用可变函数,但遇到了大量编译错误。如果可能的话,我宁愿不使用宏。谢谢!
SomeClass<VisitorType>(visitor, param1, param2, 3, 4);
这似乎对我有用。
然而,我不会在某些函数中留下这样一行代码而不提供注释来解释省略对象是故意的。另一方面,函数将是放置此类文档的方便位置:
// call C<V>'s ctor, leaving the caller to decide when to call dtor
template<template <class> class C, typename V, typename... Args>
C<V> fire_and_forget(V& visitor, Args&&... args) {
return C<V>(visitor, std::forward<Args>(args)...);
}
然后这样使用:
fire_and_forget<SomeClass>(visitor, param1, param2, 3, 4);
这应该工作(c++ 11):
template<typename class_t, typename... args_t>
void cdtor(args_t... args) {
class_t(args...) obj;
// do stuff with obj
}
cdtor<foo>(1, 2, 3);
虽然宏也可以工作:
#define cdtor(x) do { auto obj = x; /* do stuff with obj */ } while(false)
cdtor(foo(1, 2, 3));
c++ 03宏与typeof
扩展:
#define cdtor(x) do { typeof(x) obj = x; /* do stuff with obj */ } while(false)
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗