0

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

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

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

4

2 回答 2

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);
于 2011-12-07T10:50:44.693 回答
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)
于 2011-12-07T10:47:29.140 回答