48

一部のデータをファイルに出力したいと思います。たとえば、2 つの double のベクトルがあるとします。

vector<double> data1(10);
vector<double> data2(10); 

これをファイルに出力して、最初の行に見出し「data1」と「data2」が含まれ、その後に実際の内容が続く簡単な方法はありますか。データを出力する関数にはさまざまな配列が渡されるため、見出しの名前をハードコーディングすることはできません。理想的には、変数名を文字列に変換してから、その文字列に続いてベクトル配列の内容を出力したいと考えています。ただし、変数名「data1」を文字列に変換する方法、または実際に簡単に実行できるかどうかはわかりません(フォーラムを読むと、できないと思います)これが不可能な場合は、代替手段が考えられますマップなどの連想コンテナ、またはより単純に「ペア」コンテナを使用します。

pair<vector<double>,string> data1(10,'data1');  

どんな提案でも大歓迎です!

4

8 に答える 8

71

プリプロセッサ「stringify」を使用して、#必要なことを行うことができます。

#include <stdio.h>

#define PRINTER(name) printer(#name, (name))

void printer(char *name, int value) {
    printf("name: %s\tvalue: %d\n", name, value);
}

int main (int argc, char* argv[]) {
    int foo = 0;
    int bar = 1;

    PRINTER(foo);
    PRINTER(bar);

    return 0;
}


name: foo   value: 0
name: bar   value: 1

(申し訳ありませんがprintf、私は のコツをつかめませんでし<iostream>た。しかし、これで十分なはずです。)

于 2010-08-02T10:40:03.223 に答える
4

私も同じ問題を抱えていました。少し実験した後、変数、フィールド、関数、メソッド、および型の名前を文字列に変換する次のマクロを作成しました。

#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable)

#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function)

#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method)

#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type)

このコードでは、カンマ演算子と void 変換を使用して、変数、関数などが実際に存在するかどうかをコンパイラに確認させます。良い点は、初期化されていない変数でもうまく機能することです。警告メッセージなしで見つけたすべてのペダンティックなオプションを使用して、VC と GCC の両方でテストしました。

int GetAndPrintValue(const char* VariableName)
{
   std::cout << VariableName << std::endl;
   return 10;
}

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));

入力ストリームからデータを読み取るパーサーを作成するときにこのようなコードを使用し、解析された変数が範囲外の場合、有効性チェックに失敗した変数の名前で例外をスローします。

于 2016-09-06T09:49:02.273 に答える
3

プリプロセッサを使用できます。stringify トークンがありますが、関数ではなく、ソースからのみ使用できます (引数名を取得します)。

于 2010-08-02T10:30:27.657 に答える
1

明らかな答えは、出力を実行する関数が見出しテキストを文字列パラメーターとして受け取るようにすることだと思いました。

于 2010-08-02T10:34:15.527 に答える