2011-01-09 19 views
4

私は与えられた多項式の係数を保持するPolynomialクラスを持っています。
オーバーロードされたコンストラクタの1つは、可変引数リストを介してこれらの係数を受け取ることになっています。可変長引数リスト - 最後の引数を取得する方法を理解するには?

template <class T> 
Polynomial<T>::Polynomial(T FirstCoefficient, ...) 
{ 
    va_list ArgumentPointer; 
    va_start(ArgumentPointer, FirstCoefficient); 
    T NextCoefficient = FirstCoefficient; 
    std::vector<T> Coefficients; 
    while (true) 
    { 
     Coefficients.push_back(NextCoefficient); 
     NextCoefficient = va_arg(ArgumentPointer, T); 
     if (/* did we retrieve all the arguments */) // How do I implement this? 
     { 
      break; 
     } 
    } 
    m_Coefficients = Coefficients; 
} 

私は通常、受信者メソッドにパラメータの総数を知らせる余分なパラメータを渡すか、感情的終了パラメータを渡すことを知っています。しかし、短くてきれいにするために、私は余分なパラメータを渡すことを好まない。

例のメソッドシグネチャを変更せずにこれを実行する方法はありますか?

答えて

8

一般的に、いいえ、最後の引数にヒットしたときを知る方法はなく、何らかの監視指標を提供する必要があります。可変長引数リストは、このような理由から本質的に安全ではありません。静的にすべての引数が正しく受け取られているか、正しい型があるかどうかをチェックする方法はありません。ほとんどのvarargs関数を見れば、どれくらい多くの引数があるかを知る何らかの方法があります。 printfscanf C++ 0xのでは

など、openは、操作の種類を見て、フォーマット文字列を使用し、しかし、あなたは賢く、より多くのタイプセーフである、std::initializer_listを使用して、これを行うことができるでしょうvarargsに代わるもの。たとえば:

template <class T> 
Polynomial<T>::Polynomial(T FirstCoefficient, std::initializer_list<T> coeffs) 
{ 
    m_coefficients.insert(m_coefficients.begin(), coeffs.begin(), coeffs.end()); 
} 

コンパイラは、すべての引数がタイプTを持っているし、あなたのためのすべての範囲チェックを行いますことを型チェックすることができます。

2

いいえ、これはすべてのデータ構造に適用されます(引数リストは単なる別のデータ構造です)。 3.5オプションがあります:

  1. スタティック、定義済みの長さです。
  2. センチネル値。
  3. データ構造の長さが含まれます。
    3.5。データ構造体は、本質的に、データ構造体の終わりに達する前に長さを安全に導出する何らかの方法を提供します。

あなたのソリューションは、これらのオプションのいずれかに沸騰します。

+2

あなたは忘れてしまったオプション4:segfault! –

関連する問題