şey onu geliştirmek mümkün olabilir olsa çalışmalıdır: Clang gövde üzerinde
#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(?)
, bu C++ 17 modunda C++ 2a modu ve 0 1 olarak değerlendirir. GCC trunk aslında bunu C++ 17'de 1'e kadar değerlendirir, ancak bu modda __VA_OPT__
'u da işler. Bu ne yapar
bağımsız değişken sayısına dayalı _II
ait _1
veya _2
versiyonunu ya çağırmak için kullanılması BOOST_PP_OVERLOAD
olduğunu. __VA_OPT__(,)
, ,
'a genişlerse, 2 boş argüman olacaktır. Değilse, 1 boş argüman olacaktır. Her zaman bu makroyu bir argüman listesiyle çağırırız, bu yüzden __VA_OPT__
'u destekleyen herhangi bir derleyici her zaman ,
'a genişletmelidir. Boost.PP bağımlılığı doğal olarak zorunlu değildir. Doğal olarak Boost.PP bağımlılığı zorunlu değildir. Basit bir 1 veya 2-arg OVERLOAD
makrosu değiştirmek için yeterince kolay olmalıdır. genelliği biraz kaybetmek daha anlaşılır hale getirmek için:
#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__(,))
Clang gelen uyarı amaçlı bir taşınabilirlik vardır:
uyarı: variadic makro C++ 98 [-WC++ 98- uyumsuzdur uyumluluk =
Bu algılamanın C++ 11 variadic makro desteği olmadan da mümkün olup olmadığını bilmiyorum. C++ 11'den daha düşük __cplusplus
değerleri için destek almadığınızı düşünebilirsiniz, ancak Clang hala böyle bir çekle sarıldığında bile uyarı verir.
Bu, benim muhtemelen geliştirilebileceğini söylediğimde hayal ettiğim bir tür kıskançlık. Güzel iş :) – chris
GÜZEL. Teşekkür ederim. –