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 に答える