何か作業をする必要があり、あなたはそれを改善することができるかもしれないけれども:クラントランクで
#include <boost/preprocessor.hpp>
#define VA_OPT_SUPPORTED_II_1(_) 0
#define VA_OPT_SUPPORTED_II_2(_1, _2) 1
#define VA_OPT_SUPPORTED_I(...) BOOST_PP_OVERLOAD(VA_OPT_SUPPORTED_II_, __VA_OPT__(,))(__VA_OPT__(,))
#define VA_OPT_SUPPORTED VA_OPT_SUPPORTED_I(?)
を、これはC++ 17モードでC++ 2Aモードと0で1と評価されます。 GCCトランクは実際にはC++ 17でこれを1に評価しますが、そのモードでは__VA_OPT__
も処理します。
これは、BOOST_PP_OVERLOAD
を使用して、引数の数に基づいて_II
の_1
または_2
バージョンを呼び出します。 __VA_OPT__(,)
が,
に展開されると、2つの空の引数があります。そうでない場合、空の引数が1つあります。常にこのマクロを引数リストと呼びます。したがって、__VA_OPT__
をサポートするコンパイラは、常に,
に展開する必要があります。
もちろん、Boost.PPの依存関係は必須ではありません。単純な1-or-2-arg OVERLOAD
マクロは、簡単に置き換えることができます。それはより簡単にするために一般のビットを失う:
警告:
#define OVERLOAD2_I(_1, _2, NAME, ...) NAME
#define OVERLOAD2(NAME1, NAME2, ...) OVERLOAD2_I(__VA_ARGS__, NAME2, NAME1)
#define VA_OPT_SUPPORTED_I(...) OVERLOAD2(VA_OPT_SUPPORTED_II_1, VA_OPT_SUPPORTED_II_2, __VA_OPT__(,))(__VA_OPT__(,))
クランからの警告1つのポータビリティがある可変引数マクロはC++ 98 [-WC++との互換性がありませんが98-
この検出がC++ 11バリアブルマクロをサポートしていなくても可能かどうかわかりません。 __cplusplus
の値がC++ 11より低いと仮定することも考えられますが、このようなチェックでラップされても警告は表示されます。
これは私が想像していたような簡潔さです。ニースの仕事:) – chris
NICE。ありがとうございました。 –