使用给定类型和构造函数参数创建和销毁临时的C ++函数

时间:2011-12-07 10:42:22

标签: c++ raii visitor variadic

我在代码中发现了很多以下内容:

{
    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
}

我尝试使用可变参数函数但遇到了大量编译错误。如果可能的话,我宁愿不使用宏。谢谢!

2 个答案:

答案 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)