2017-11-16 9 views
-1

私は簡単な印刷機能を持つテンプレート付きバッファクラスを用意しています。データ型に基づくprintf形式

template <typename valueType, typename sumType, int N> 
class IM_buffer 
{ 
public: 
    IM_buffer() 
     : bufferValues(), numValues(-1), currentSum() { } 

    void record(valueType sample) 
    { 
     // Set buffer index to be recorded 
     numValues++; 

     // Get memory location for oldest element in buffer 
     valueType& oldest = bufferValues[modIdx(numValues)]; 

     // Add the input value to the current sum and take away the value being replaced 
     currentSum += sample - oldest; 

     // And now do the actual replacement in the same memory location 
     oldest = sample; 
    } 

    valueType getCurrent()   { return bufferValues[modIdx(numValues)];   } 
    valueType getNthPrev(int Nprev) { return bufferValues[modIdx(numValues-Nprev)];  } 
    sumType  getCurrentSum()   { return currentSum;        } 
    double  getAvg()    { return (double) currentSum/MIN(numValues+1, N); } 
    int   getNumValues()   { return numValues+1;        } 
    int   getBufferSize()   { return N;           } 

    void printBuff() 
    { 
     for (int ii=0; ii<N; ii++) 
     { 
      // if it's an integer type I need: 
      printf("bufferValues[%2d]=%4d\n",ii,bufferValues[ii]); 
      // but if it's a floating point type I need: 
      printf("bufferValues[%2d]=%8g\n",ii,bufferValues[ii]); 
     } 
    } 

    void clear() 
    { 
     for (int ii=0; ii<N; ii++) 
      bufferValues[ii] = (valueType) 0.0; 
     numValues = 0; 
     currentSum = (sumType) 0.0; 
    } 

private: 
    valueType bufferValues[N]; 
    int numValues; 
    sumType currentSum; 

    int modIdx(int a) { return (a % N + N) % N; } 
}; 

しかし、printfのフォーマット文字列は、データ・タイプ(例えば整数、対フロート、対二重)が何であるかに依存しなければなりません。私はthisのような議論を見たことがありますが、私は実際にデータ型を印刷したくはありません。データ型に基づいてprintf形式の文字列を変更する必要があります。どのように右のprintfを選択するためにいくつかの条件のロジックを実装する方法の誰かが正しい方向に私を指すことができますか?

+1

これは 'std :: cout'のようなC++ストリームの素晴らしい点の1つで、' p rintf'。つまり、C++では 'printf'を使わないでください。 –

+0

@Someprogrammerdude私は正確な衝突を覚えていませんが、 '#include 'はコードの他の部分を壊しています。なぜなら、私は 'printf'をインクルードヘッダのより小さなセットに使っていたのです。 – Mike

+0

それからやってはならないことをやっている。あなたは新しい質問でその問題について尋ねるべきです。 –

答えて

1

コメントに記載されているその他のものとして、すべての組み込み型に対してオーバーロードを持つstd::coutを使用する必要があります。しかし、あなたが本当にprintfを使う、という場合は、次のハック試すことができます。

#include <typeinfo> // for typeid 

std::string printfCmd("I wish to print this: "); 
// int myVar = 69; // uncomment to change var type to int 
char myVar = 'd'; 
if (typeid(int) == typeid(myVar)) { 
    printfCmd += "%d"; 
} else if (typeid(char) == typeid(myVar)) { 
    printfCmd += "%c"; 
} else { 
    // some warning/error 
} 

printf(printfCmd.c_str(), myVar); 

をそれはあなたが本当にしている場合にのみ、それを使用し、良い解決策ではありません。

0

あなたがC++オーバーロードされた挿入演算子を使用したくない場合は、独自のオーバーロードされた関数記述することができます。必要なときに今、あなたはあなたのprintBuff関数からprintを呼び出すことができます

void print(int i) { 
    printf("%4d",i); 
} 

void print(double d) { 
    printf("%8g",d); 
} 

など

を:

printf("bufferValues["%2d] =",ii); 
print(bufferValues[ii]); 
printf("\n"); 
関連する問題