簡體   English   中英

帶有宏的C ++嵌套命名空間

[英]C++ nested namespaces with a macro

這個問題是基於

我想效仿

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 { ,甚至更好。

你可以用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 {

這可以做得更簡單:

#define OP(s, state, x) state namespace x {
#define NS(...) BOOST_PP_SEQ_FOLD_LEFT(OP, , BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

您不必單獨處理第一個命名空間,這樣您就不必在NS宏本身中編寫namespace

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM