0

今日、私はひどい問題に遭遇しました。私は、可変個引数テンプレートを使用するクラスでフレームワーク全体に取り組んできました。そして、私が一緒に働いている人は、可変個引数テンプレートをまだサポートしていないビジュアル スタジオを使用していることがわかりました。

マクロを使って機能をシームレスに移植しようとしましたが、長い作業の結果、このままでは不可能のようです。問題は、テンプレートのパラメーターの数が 0 から 4 (または可変個のテンプレートでは無限大) まで変化する可能性があることです。

私のマクロは作成され、次のようなものに費やされますが:

template<>
Signal<void ()>
{
// My class
};

また

template<typename param1>
Signal<void (param1)>
{
// My class
};

しかし問題は、これが gcc では機能しないように見えることです (したがって、vc でも機能しないと仮定します)。

ヘッダーにはエラーは表示されませんが、次のようにクラスをインスタンス化しようとすると:

Signal<> mySignal;

次のようなエラーが発生します。

error: wrong number of template arguments (0, should be 1)

この件に関する情報が見つからないので、少なくとも私が試みていることが可能かどうか知りたいですか? または、マイクロソフトは可変個引数テンプレートが十分に重要であるとは考えていないため、本当に何百行ものコードを再度作成する必要がある場合は??

4

1 に答える 1

2

引数のないテンプレートを使用することはできません。問題に対する一般的なアプローチは、voidまたはその他のプレースホルダーを使用することです。関数のようなオブジェクトをシミュレートしているため、関数シグネチャである単一の型を使用してこれを単純化できることに注意してください。

Signal< void() >

そうすれば、常に単一のテンプレート引数があり、署名に 0 ~ 4 個の引数がある場合に備えて、そのテンプレートの特殊化を提供するだけで済みます。

template <typename S>
struct Signal;

template <typename arg1>
struct Signal<void (arg1)> { ... };
template <typename arg1, typename arg2>
struct Signal<void (arg1,arg2)> { ... };

シグナル/ハンドラーまたはイベント ライブラリを構築している場合は、既存の実装を確認することをお勧めします。たとえば、ブースト信号/信号2ライブラリのコードを使用するか、少なくとも見ることを検討してください。


ヘッダーにはエラーは表示されませんが、次のようにクラスをインスタンス化しようとすると:

Signal<> mySignal;

問題は、テンプレートが関数シグネチャである単一の引数を取るが、引数を提供していないことです。インスタンス化の時点で、テンプレート引数を提供する必要があります。あなたはおそらく次のことを意味します:

Signal<void ()> mySignal;
于 2012-05-16T03:20:43.173 に答える