我正在寻找一种基于类型自动定义唯一对象/符号名称的方法,如下例所示,其中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
不能包含多个相同类型的成员。
感谢您的帮助。
答案 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__
此宏以十进制整数常量的形式扩展为当前输入行号。虽然我们称之为预定义的宏,但它是一个非常奇怪的宏,因为它的“定义”随着每一个新的源代码行而改变。