0

構造体の内容を展開するマクロを作成しようとしています:

struct Str
{
    int a;
    float f;
    char *c;
};
Str s = {123, 456.789f, "AString"};

#define STRINGIFY_STR(x) ... // Macro to stringify x which is an instance of Str

printf("%s", STRINGIFY_STR(s));

必要な出力: [a: 123, f:456.789, c:AString]

これを行うマクロを書くことは可能ですか? もしそうなら、どうやって?

4

4 に答える 4

6

これをマクロとして実行したい理由はありますか?

プリプロセッサを使用する代わりに、このアクションを実行する関数を作成する必要があります。


目的に応じて、いくつかのオプションがあります。boost 書式設定ライブラリは、書式設定された文字列を作成するための優れたツールキットを提供します。常にオーバーロードoperator<<して、クリーンな出力を提供することもできます。

純粋な C でこれを行っている場合、sprintfファミリのメソッドは、書式設定された出力を作成するために機能します。

于 2012-06-16T00:56:28.433 に答える
1

これはかなりグロスで、gcc/でのみ機能しg++ます。

#define STRINGIFY_STR(x) \
    std::string(({ std::ostringstream ss; \
                   ss << "[a: " << x.a \
                      << ", f: " << x.f \
                      << ", c: " << x.c << "]"; \
                   ss.str(); })).c_str()

値から文字列を作成する必要があります。このようにしないでください。リードのアドバイスに従ってください。

structきれいに印刷できるように変更する方法は次のとおりです。

struct Str
{
    int a;
    float f;
    char *c;

    std::ostream & dump (std::ostream &os) const {
        return os << "[a: " << a
                  << ", f: " << f
                  << ", c: " << c << "]";
    }
};

std::ostream & operator << (std::ostream &os, const Str &s) {
    return s.dump(os);
}

Str s = {123, 456.789f, "AString"};

今、印刷するsには、次を使用できますstd::cout

std::cout << s << std::endl;

または、本当に文字列が必要な場合:

std::stringstream ss;
s.dump(ss);
puts(ss.str().c_str());
于 2012-06-16T01:16:20.063 に答える
1
struct stringify
{
    operator std::string() const
    {
        return str ;
    }
    std::string str ;
};

template < typename T > stringify operator+ ( stringify s, const T& object )
{
    std::ostringstream stm ;
    stm << object ;
    if( !s.str.empty() && !std::isspace( *s.str.rbegin() ) ) s.str += ' ' ;
    s.str += stm.str() ;
    return s ;
}
于 2014-05-09T08:45:55.123 に答える
0

私もこのアプローチに反対ですが、質問に答えるために:

#define STRINGIFY_STR(x) \
   (std::string("[a: ") + std::to_string((long double)x.a) \
  + std::string(", f:") + std::to_string((long double)x.f) \
  + std::string(",c: ") + x.c + std::string("]") ).c_str()

ただし、これを行うメンバー関数を作成することをお勧めします。

于 2012-06-16T01:15:15.480 に答える