C++不定個数パラメータ書き方
個数パラメータの関数が書けない場合があります.c言語のsprintf関数のようです.
関数の明示方法は比較的固定されています.
return-type functionName( [type t1] …)
例えば、void fun(...);
int printf ( const char * format, … );
省略記号の位置は不定個数のパラメータリストです.
次に、一般的な3つの書き方を示します.メソッド1データの具体的なタイプがわかる場合 メソッド2 va_の使用startva_endva_Argおよびvsnprintf メソッド3 Boostformat を使用
方法1:データの具体的なタイプを知っている場合
例えば、データがint型であることがわかります.
メソッド2:va_の使用start()、va_end()、va_Arg()とvsnprintf()
この方法はcのライブラリ関数を使用する必要があります.現在よく使われているのは以下の4つの関数です.
まだ4つあまり使われていませんが、実装機能は以上の4つと同じですが、パラメータリストva_を使用しています.list.
後の4つの関数のうち、va_start()、va_end()、va_arg()は長くなる鍵です.次のように使用します(関数の例).
方法3:Boost::formatを使用
方法2はすでに比較的に実用的であるが,結局cの関数を主とし,処理は当時データオーバーフローが発生する可能性がなく,誤りを見つけにくい.この場合、Boost::formatを考慮することができます.これはBoostの機能ライブラリで、文字列をフォーマットしています.エラーが発生すると異常が放出されます.Boost.Formatはクラスで、拡張性はいいですが、効率はsprintfよりずっと悪いです.使用法は次のとおりです.
boost.format指定フォーマットは、[N$][flags][width][.precision]type-charの形式で指定します.
ここで、N$はN番目のパラメータを指定するために使用されますが、このパラメータはすべて加算されるか、加算されません.
flagsは、整列などのフォーマットを処理するために使用されます.
widthは現在の幅を指す
.precision小数点以下何桁
type-charとはデータ型(sprintfと同じ)を指す
またboost.formatには、本文の最初の例のように、便利な使い方%N%があります.
boost.formatが投げ出した異常はbad_format_string、too_few_args、too_many_args、out_of_rangeなど.
関数の明示方法は比較的固定されています.
return-type functionName( [type t1] …)
例えば、void fun(...);
int printf ( const char * format, … );
省略記号の位置は不定個数のパラメータリストです.
次に、一般的な3つの書き方を示します.
方法1:データの具体的なタイプを知っている場合
例えば、データがint型であることがわかります.
#include<iosteam>
void sum(int a, ...){
int *temp = &a, sum=0;
++temp;
for (int i = 0; i < a; ++i)
sum+=*temp++;
}
int main(){
std::cout<<sum(4, 1, 2, 3, 4)<<std::endl;
return 0;
}
メソッド2:va_の使用start()、va_end()、va_Arg()とvsnprintf()
この方法はcのライブラリ関数を使用する必要があります.現在よく使われているのは以下の4つの関数です.
#include <stdarg.h>
int printf(const char *format, ...); //
int fprintf(FILE *stream, const char *format, ...); //
int sprintf(char *str, const char *format, ...); // str
int snprintf(char *str, size_t size, const char *format, ...); // size str ,
まだ4つあまり使われていませんが、実装機能は以上の4つと同じですが、パラメータリストva_を使用しています.list.
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
後の4つの関数のうち、va_start()、va_end()、va_arg()は長くなる鍵です.次のように使用します(関数の例).
char s[1000];
int log(char *s, int size, const char *fmt, ...) // , snprintf() 。
{
va_list ap;
int n=0,size=1000;
va_start(ap, fmt); // , fmt, , ”%d%s“
n=vsnprintf (s, size, fmt, ap); // s
va_end(ap); // , va_start
return n; //
}
方法3:Boost::formatを使用
方法2はすでに比較的に実用的であるが,結局cの関数を主とし,処理は当時データオーバーフローが発生する可能性がなく,誤りを見つけにくい.この場合、Boost::formatを考慮することができます.これはBoostの機能ライブラリで、文字列をフォーマットしています.エラーが発生すると異常が放出されます.Boost.Formatはクラスで、拡張性はいいですが、効率はsprintfよりずっと悪いです.使用法は次のとおりです.
#include <boost/format.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace boost;
int main(){
// % % , % 。
cout<<format("%1%=%2%")%"x"%1.1<<endl;
// :x=1.1
// , ,
boost::format fmter("%2% %1%");
fmter % 21;
fmter % 20;
cout << fmter << endl;
// : 20 21
//
string s = fmter.str();
// printf
cout<<format("%.2f-%s")%5.1%"abc"<< endl;
// :5.10-abc
// printf N$
cout<<format("%2$.2f-%1$s%") %5.1%"abc"<< endl;
// :5.10-abc
}
boost.format指定フォーマットは、[N$][flags][width][.precision]type-charの形式で指定します.
ここで、N$はN番目のパラメータを指定するために使用されますが、このパラメータはすべて加算されるか、加算されません.
flagsは、整列などのフォーマットを処理するために使用されます.
widthは現在の幅を指す
.precision小数点以下何桁
type-charとはデータ型(sprintfと同じ)を指す
またboost.formatには、本文の最初の例のように、便利な使い方%N%があります.
boost.formatが投げ出した異常はbad_format_string、too_few_args、too_many_args、out_of_rangeなど.