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

C++ function to create and destroy temporary with given type and constructor parameters

本文关键字:函数 c++ 参数 类型 构造函数 创建      更新时间:2023-10-16

我发现我的代码中有很多如下内容:

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