我在代码中发现了很多以下内容:
{
SomeClass<VisitorType> obj(visitor, param1, param2, 3, 4);
}
{
OtherClass<VisitorType> obj(visitor, 5, "six");
}
必须使用大括号来确保对象的生命周期受到限制,工作是在构造函数和析构函数(RAII样式)中完成的。这是有充分理由的,而这些类模板的其他用户所做的不仅仅是构造和破坏。
是否有一个方便的习惯用法将其归结为函数调用,在可能的情况下保留强类型?
e.g。
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
}
我尝试使用可变参数函数但遇到了大量编译错误。如果可能的话,我宁愿不使用宏。谢谢!
答案 0 :(得分:3)
怎么样?
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);
答案 1 :(得分:0)
这应该有效(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));
带有typeof
扩展名的C ++ 03宏:
#define cdtor(x) do { typeof(x) obj = x; /* do stuff with obj */ } while(false)