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型であることがわかります.
    #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など.