此问题基于
我想模仿
namespace foo::bar::baz {
在C ++ 17到来之前使用宏。
我在思考:
#define BOOST_PP_VARIADICS
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/fold_left.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define OP(s, state, x) BOOST_PP_CAT(state, BOOST_PP_CAT( { namespace, x )) {
#define NS(...) namespace BOOST_PP_SEQ_FOLD_LEFT(OP, BOOST_PP_SEQ_HEAD(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)), BOOST_PP_SEQ_TAIL(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)))
NS(foo, bar, baz)
基于第二个链接,但这给了我:
namespace foo { namespacebar { namespacebaz {
如何在namespace
和标识符之间添加空格?
修改
如果您可以创建一个宏,以便ns(foo::bar::baz)
扩展到namespace foo { namespace bar { namespace baz {
,那就更好了。
答案 0 :(得分:2)
使用BOOST_PP_SEQ_FOR_EACH
:
#define BOOST_PP_VARIADICS
#include <boost/preprocessor/variadic/to_seq.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#define OP(s, state, x) namespace x {
#define NS(...) BOOST_PP_SEQ_FOR_EACH(OP, , BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
NS(foo, bar, baz)
这扩展到
namespace foo { namespace bar { namespace baz {
答案 1 :(得分:1)
这可以更简单:
#define OP(s, state, x) state namespace x {
#define NS(...) BOOST_PP_SEQ_FOLD_LEFT(OP, , BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
您不必单独处理第一个命名空间,这样您就不能在namespace
宏本身中编写NS
。