带有宏的C ++嵌套命名空间

时间:2015-06-28 13:10:22

标签: c++ macros c-preprocessor

此问题基于

我想模仿

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 {,那就更好了。

2 个答案:

答案 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

Demo