有没有一种方法可以在类型声明中为声明的(周围的)类型本身构建一个typedef
,而不声明类型的名称?
示例:
class X
{
public:
typedef <fill in magic here> MyType;
//...
};
背景:乍一看,这似乎很愚蠢。我需要它,因为我使用宏来构建我的数据类的编译时反射。因此,在数据类的声明中插入了一个宏,它需要处理插入到其中的类型。到目前为止,我找到了适用于MSVC和g++的有效解决方案,它们都依赖于我认为是实现中的缺陷。因此,它们可能在较新的版本上不起作用。Clang不会“吃掉”这些解决方案中的任何一个。
我目前的MSVC解决方案定义了一个方法,然后只通过它的名称获取它的地址,并调用一个小帮助器来“返回”它的类的类型。(Clang和g++期望方法的全名,包括它的类名)。
我当前的g++解决方案定义了一个返回类型为std::remove_reference(decltype(*this))
的静态方法。(Clang和MSVC不允许在静态上下文中使用this
)。
我绝对更喜欢标准的conform解决方案,但对于clang的特殊解决方案目前也是可以的。
如果什么都不起作用,我必须将类名传递给宏,但我会尽量避免这种情况,因为我已经有大量使用宏的代码。
编辑:添加一个关于反射如何工作的示例(这可能会阐明我需要什么):
class X : public Y
{
public:
//.. constructor and such stuff...
int a;
double b;
std::string c;
CLASSHEAD(Y)
FIELD(a)
FIELD(b)
FIELD(c)
CLASSFOOT
};
CLASSHEAD
是应该定义typedef
的宏。它是一个VAR_ARGS宏,其中的参数接收基类。如上所述:可以将它的类名作为它的第一个参数(导致在本例中为CLASSHEAD(X, Y)
)。但是我几乎无法想象像定义周围类型这样“简单”的任务没有解决方案……
发布于 2016-02-16 03:32:26
Nohting不起作用,因此在宏中使用类名是唯一有效的解决方案
发布于 2016-02-03 07:42:56
这并不完全符合您的规范,但我认为它非常接近:
class X
{
//Stuff...
//Use Macros to add:
struct MyType;
//Use class closing macro to insert variable between class-ending brace and semicolon
} TYPE_VAR;
//Perhaps add random stuff to TYPE_VAR name to avoid collisions, like __FILE__
struct decltype(TYPE_VAR)::MyType
{
typedef decltype(TYPE_VAR) V;
};
然后使用以下命令访问X的类型
X::MyType::V
例如,简化的CLASSFOOT可能如下所示:
#define CLASSFOOT /*Your classfoot here*/ } TYPE_VAR; struct decltype(TYPE_VAR)::MyType {typedef decltype(TYPE_VAR) V;
//No }; at end on purpose- this will come from the class in which you placed CLASSFOOT
这对你的目的来说足够好了吗?
发布于 2016-02-04 05:40:29
由于您已经在使用宏,因此可以使用此解决方案https://stackoverflow.com/a/21143997/2173029
#define CLASS_WITH_MY_TYPE(ClassName) \
class ClassName \
{ \
using MyType = ClassName;
然后使用像这样
CLASS_WITH_MY_TYPE(X)
public:
struct Y
{
using T = MyType;
};
};
static_assert(std::is_same<X, typename X::Y::T>::value, "");
标记为社区维基,因为@Chris提到了该链接,原始答案由@Bartek Banachewicz发布
https://stackoverflow.com/questions/35033910
复制相似问题