4

printfのように動作するコンストラクターで使用するのに便利な例外クラスを作成しようとしています。例:

class ExcBase
{
    ExcBase(const char *fmt, ...)
    {
        // call things like vsprintf
    }
};

しかし、コンストラクトの継承はC ++では利用できないようですので、継承されたクラスを次のように書きたいと思います:

class ExcChild : public ExcBase
{
    ExcChild(const char *fmt, ...)
       : ExcBase(fmt, ...) // XXX: how to pass the trailing parameters to the constructor?
    {
    }
};

または、すべての子クラスに対して同じコンストラクターを作成する必要があり、それは面倒でした...

この質問は私を大いに悩ませています。これを解決する方法がわかりません...どんな情報でも大きな助けになります...

4

4 に答える 4

1

コンストラクターですべての作業を実行しようとしないでください。それを細かく分割します-任意の便利な方法で文字列を作成する関数を提供し、その文字列をコンストラクターに渡します。

std::string format_string(const char * fmt, ...);

class ExcBase
{
    ExcBase(const std::string & message);
};
于 2012-04-19T03:30:17.067 に答える
1

コードをサポートしていない古いコンパイラでコンパイルする必要がない場合は、using 句を使用してコンストラクタを継承できます (ただし、今後の VC++11 はこのように「古い」と見なされます...)

または、実際の構築作業を vprintf のような関数に入れて、コンストラクターに呼び出させることもできます。

于 2012-04-19T03:06:21.790 に答える
0

複雑な作業をva_list引数を取る関数に分離すると、各子コンストラクターからそれを呼び出すことができるはずです(子型ごとに実装する必要があります)。次に、複製されたコード(クラスごと)はva_listを宣言し、va_start、新しい(ベース)関数、およびva_endを呼び出します。それを行うことについてのSOに関する投稿がここにあります。

于 2012-04-19T03:32:28.613 に答える
0

C++11 タプルを使用してテンプレート化することもできますが、それしか思い浮かびません。

于 2012-04-19T03:20:44.640 に答える