簡體   English   中英

如果在名稱空間內創建了類型,我怎么知道?

[英]How can I find out, if type is created inside namespace?

我創建了標簽系統,該標簽系統允許ma引擎中的標簽實體。 它基於c ++類型工作,因此每個標記都是一種類型(我有我的理由)。

現在,當我想創建新標簽時,必須調用struct tagname{};

如果要在其他文件中使用標記,請使用前向聲明struct name;

為了使其更加用戶友好,我創建了宏

#define CREATE_TAG(name) struct name{};
#define USE_TAG(name)    struct name;

但是當用戶在命名空間內部調用一個宏而在外部命名空間另一個調用時,我遇到了問題,因為那是2種不同的類型。

我想確保用戶調用任何命名空間之外的宏。 由於我們的項目位於一個名稱namespace root名稱namespace root ,因此我可以將其用於chcecking。

到目前為止,這是我想出的:

namespace root
{
    const unsigned TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE = 1;
};

#define CREATE_TAG(name)    namespace root{  struct name{}; static_assert(root::TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE,"");  }
#define USE_TAG(name)       namespace root{  struct name;   static_assert(root::TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE,"");  }

現在,當在根名稱空間之外使用宏時,一切都很好。 在根名稱空間或其他嵌套名稱空間內調用時,它給出錯誤TAGS_CAN_BE... not a member

但是我真的不喜歡。 我不喜歡整個宏,但這不是問題。 問題是:如果在命名空間中調用了宏,是否有更好的方法來查找? 自從我的宏傳入Type以來,我可以使用一些typetrait,但是找不到任何合適的typetrait。

您可以嘗試這樣的事情:

#include <type_traits>
#define DECLARE_ME(name) struct tag_##name { static_assert(!std::is_same<tag_##name, ::tag_##name>::value, "Not in global namespace"); }

在濫用情況下,您可能會遇到甚至不是靜態斷言的編譯器錯誤,但應該可以解決問題。 您可以通過更精細的特征類使它更易於使用。

所以看起來

namespace root
{
    const unsigned TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE = 1;
};

#define CREATE_TAG(name)    namespace root{  struct name{}; static_assert(root::TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE,"");  }
#define USE_TAG(name)       namespace root{  struct name;   static_assert(root::TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE,"");  }

答案是...

我將等待幾天才能接受。 我仍然歡迎您的回答

暫無
暫無

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

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