2016-08-16 11 views
1

呼び出されるctorに応じて、メンバの異なるテンプレートクラスが必要です。 私は基本クラスを持つsfinaeを使って別のメンバーを持つクラスを取得できました(私はこれをほぼSFINAE on member variableのようにしました)。 今、私の質問は、クラスのどのctorが呼び出されているかによって、メンバーが異なる単一のテンプレートクラスを達成できますか? 誰かがこれを達成する方法を知っているかもしれません。コンストラクタに応じてメンバの数を変更します。

編集:私は現在、boost::variantを使用していますが、問題は、バリアントの中で最大のオブジェクトが巨大で、最小のものがポインタであることです。これは実際のパフォーマンス上の問題です。なぜなら、ほとんどの場合、ポインタはバリアント内にあるからです。

EDIT II:これはctorでうまくいくとすれば素晴らしいかもしれませんが、そうでなければ工場での作業もうまくいくでしょう。

EDIT III(または私が達成しようとしていること): 現在、C++に変換するDSLを作成しています。 多型を可能にしようとしているので、私は関数へのポインタだけを渡しています。いくつかのポインタは参照カウントされ、いくつかのポインタは生のものであり、ユーザが望むものに応じて、shared_pointersと同じクラスの生ポインタがあります。その理由は私は2つの異なるクラスを作ることができない理由は、関数がポインタ上で呼び出される場合、それは同じ関数でなければならない、そうでなければ、私に与えるだろうすべてのfnctionsをオーバーロードする必要があります 2 ** n関数n個の引数を持つ。 これは、クラスを作成しようとしている理由です。これは、ctorに渡される内容に基づいて、生のポインタまたはshared_ptrを表すことができます。

+2

コンストラクタである必要がありますか?代わりに工場機能にすることはできますか? – ildjarn

+3

これは奇妙なアイデアのように見えます...あなたは正確に何をしようとしていますか? – Holt

+0

@ildjarn:まさに私の考え方:-)必要に応じてオブジェクトを配信するジェネレータ/ファクトリを作成します。 – Klaus

答えて

1

あなたは、単にvariant<>を継続して使用するが、代わりにオブジェクトとしてあなたの巨大なクラスを格納するだけでなくポインタとしてそれを格納する必要があります

boost::variant<common_case*, huge_class*> 

あなたは通常、とにかくポインタを格納言うので、これにはありませんすべてのオブジェクトポインタが同じサイズなので、無駄なメモリの100%を再利用します。

関連する問題