1

問題を示すために、この単純な(役に立たない)コードがあります。

template<typename _Tx, typename _Ty>
struct foo{};

#define TO_STRING(Type) #Type

int main()
{
    std::string sInt = TO_STRING(int);
    std::string sfoo1 = TO_STRING(foo<int, float>); //warning and unexpected value - "foo<int"
    std::string sfoo2 = TO_STRING((foo<int, float>)); //no warning, still unexpected value "(foo<int, float>)"
}

を使用せずに複数の引数を持つテンプレートをマクロに渡す方法はあります ()か?

4

1 に答える 1

0

これは理想的ではないかもしれませんが、ほぼすべてのコンパイラで動作すると思います (動作しないコンパイラを見つけた場合は、インターフェイスを変更せずに簡単に馬鹿にすることができます)。

#define TO_STRING1(_a_) #_a_
#define TO_STRING2(_a_, ...) #_a_ ", " TO_STRING1(__VA_ARGS__)
#define TO_STRING3(_a_, ...) #_a_ ", " TO_STRING2(__VA_ARGS__)
#define TO_STRING4(_a_, ...) #_a_ ", " TO_STRING3(__VA_ARGS__)

唯一の欠点は、コンマを自分で数えなければならないことです。

std::string sInt = TO_STRING1(int);
std::string sfoo = TO_STRING2(foo<int, float>);
于 2013-04-10T13:04:11.767 に答える