2015-06-16 90 views
0

我有一個名稱空間的類名,如BasicType::MyType在宏中拆分字符串

可以創建一個宏來拆分名稱並僅使用範圍操作符後面的部分(我想在沒有第一部分的情況下在宏中創建一個對象MyType)?

編輯:

我使用的是不同的一個類庫中的命名空間BasicType

BasicType::ClassA 
BasicType::ClassB 
... 

爲了使用這些類,我需要註冊。我必須和另一個類進行註冊,並希望類的名稱,沒有命名空間:

BasicType::ClassA classa; 
masterClass.register("ClassA", classa); 

爲了在模板中使用它們(因爲我必須使用多類此命名空間),我米創造一個特質,與宏自動化(因爲ClassA我也有ClassAImplClassATypeSupport等):

#define BASICTYPE_TRAITS(className) \ 
    template <> \ 
    struct DDSTraits<className> \ 
    { \ 
    using TypeSupportImpl = className##Impl; \ 
    using TypeSupport_var = className##TypeSupport; \ 
    }; 

template <typename T> 
struct BASICTYPE_TRAITS 
{ 

}; 
.... 
BASICTYPE_TRAITS(BasicType::ClassA) // after this I've my trait 

現在,我想在這個特質與類的名稱添加一個字符串,所以我可以使用它註冊類masterClass

+4

爲什麼你需要它?這似乎是一個XY問題。 –

+0

我已編輯帖子。 – Jepessen

+1

爲什麼不接受_two_參數給宏:命名空間名稱和類名? 'BASICTYPE_TRAITS(BasicType,ClassA)' – Petr

回答

1

您只需更改宏,以便它將接受兩個參數:命名空間名稱和類名稱。類似於

#define BASICTYPE_TRAITS(namespaceName, className) \ 
    template <> \ 
    struct DDSTraits<namespaceName::className> \ 
    { \ 
    using TypeSupportImpl = namespaceName::className##Impl; \ 
    using TypeSupport_var = namespaceName::className##TypeSupport; \ 
    }; 

template <typename T> 
struct BASICTYPE_TRAITS 
{ 

}; 
.... 
BASICTYPE_TRAITS(BasicType, ClassA) // after this I've my trait