私は簡単な印刷機能を持つテンプレート付きバッファクラスを用意しています。データ型に基づく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
を選択するためにいくつかの条件のロジックを実装する方法の誰かが正しい方向に私を指すことができますか?
これは 'std :: cout'のようなC++ストリームの素晴らしい点の1つで、' p rintf'。つまり、C++では 'printf'を使わないでください。 –
@Someprogrammerdude私は正確な衝突を覚えていませんが、 '#include'はコードの他の部分を壊しています。なぜなら、私は 'printf'をインクルードヘッダのより小さなセットに使っていたのです。 –
Mike
それからやってはならないことをやっている。あなたは新しい質問でその問題について尋ねるべきです。 –