如何根据类型

时间:2016-04-06 14:14:57

标签: c++

我正在寻找一种基于类型自动定义唯一对象/符号名称的方法,如下例所示,其中MEMBER(TypeName)是代表/扩展的东西(宏/等等......)到唯一的对象标识符,该标识符是从TypeName定义的。

class A { int i; };
class B { int i; };
class X
{
    A MEMBER(A);
    B MEMBER(B);
    X()
    {
        MEMBER(A).i = 1;
        MEMBER(B).i = 2;
    }
};

我首先尝试使用以下简单宏来执行此操作:

#define MEMBER(TypeName)    m_ ## TypeName
只要TypeName不是NameSpace::Type之类的完全限定名称,

效果很好;所以我仍然在寻找一个使用完全限定类型名称的解决方案。

注1:上述类X成员的定义和使用语法仅用于阐明我的需求;解决方案可能涉及一种完全不同的方式来定义和使用成员 注2:班级X的成员不得为静态 注3:对班级X内成员的访问速度必须很快;最好是编译时解决方案 注4:类X不能包含多个相同类型的成员。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

如果名字很麻烦,那么让我们使用元组彻底摆脱它们:

#include <tuple>

class A: public std::tuple<int>{};
class B: public std::tuple<int>{};

class X: std::tuple<A,B> {
public:
   X() {
     std::get<int>(std::get<A>(*this)) = 1;
     std::get<int>(std::get<B>(*this)) = 2;
   }
};

答案 1 :(得分:1)

#define DECL_NMEMBER(NameSpace, TypeName) NameSpace::TypeName m_##NameSpace##_##TypeName;
#define NMEMBER(NameSpace, TypeName) m_##NameSpace##_##TypeName
#define DECL_MEMBER(TypeName) DECL_NMEMBER(, TypeName)
#define MEMBER(TypeName) NMEMBER(, TypeName)

namespace N 
{
class A { public: int i; };
class B { public: int i; };
}

class C { public: int i; };

class X
{
    DECL_NMEMBER(N, A)      // N::A
    DECL_NMEMBER(N, B)      // N::B
    DECL_MEMBER(C)          // C
    DECL_NMEMBER(std, string)   // std::string
    DECL_MEMBER(wstring)    // std::wstring (using namespace std)
    X()
    {
        NMEMBER(N, A).i = 1;
        NMEMBER(N, B).i = 2;
        MEMBER(C).i = 5;
        NMEMBER(std, string) = "test";
        MEMBER(wstring) = L"test2";
    }
};

但是对于像vector<T>这样的某些类型,你需要制作一些额外的宏( 我猜没有完美的解决方案

答案 2 :(得分:0)

您可以使用__LINE__ marco作为marco的混合部分:

  

__LINE__   此宏以十进制整数常量的形式扩展为当前输入行号。虽然我们称之为预定义的宏,但它是一个非常奇怪的宏,因为它的“定义”随着每一个新的源代码行而改变。