gpt4 book ai didi

c++ - 如何检测一个类是否有成员变量?

转载 作者:可可西里 更新时间:2023-11-01 17:34:21 29 4
gpt4 key购买 nike

问题

我想检测一个类是否有成员变量,如果有,则静态断言失败。像这样的东西:

struct b {
int a;
}
static_assert(!has_member_variables<b>, "Class should not contain members"). // Error.

struct c {
virtual void a() {}
void other() {}
}
static_assert(!has_member_variables<c>, "Class should not contain members"). // Fine.

struct d : c {
}
static_assert(!has_member_variables<d>, "Class should not contain members"). // Fine.

struct e : b {
}
static_assert(!has_member_variables<e>, "Class should not contain members"). // Error.

struct f : c {
char z;
}
static_assert(!has_member_variables<f>, "Class should not contain members"). // Error.

有没有办法用 SFINAE 模板实现这一点?该类可能具有继承甚至多重继承与虚函数(尽管基类中没有成员)。

动机

我有一个非常简单的设置如下:

class iFuncRtn {
virtual Status runFunc(Data &data) = 0;
};

template <TRoutine, TSpecialDataType>
class FuncRoutineDataHelper : public iFuncRtn {
Status runFunc(Data &data) {
static_assert(!has_member_variables<TRoutine>, "Routines shouldnt have data members!");
// Prepare special data for routine
TSpecialDataType sData(data);
runFuncImpl(sData);
}

class SpecificRtn :
public FuncRoutineDataHelper<SpecificRtn, MySpecialData> {
virtual Status runFuncImpl(MySpecialData &sData) {
// Calculate based on input
sData.setValue(someCalculation);
}
};

FunctionalityRoutine 是在每个滴答的基础上进行管理和运行的。它们是定制的,可以执行各种各样的任务,例如联系其他设备等。传入的数据可以由例程操作,并保证在每个 tick 执行时传入,直到功能完成。根据 DataHelper 类传入正确类型的数据。我不想阻止 future 的人错误地将数据添加到功能例程中,因为这不太可能达到他们的预期。为了强制执行此操作,我希望找到一种使用静态断言的方法。

最佳答案

您可以通过编译器执行空基类优化来解决此问题,方法是检查从 T 派生的类是否与具有虚函数的空类具有相同的大小:

template<typename T, typename... BaseClasses>
class IsEmpty
{
// sanity check; see the updated demo below
static_assert(IsDerivedFrom<T, BaseClasses...>::value);

struct NonDerived : BaseClasses... { virtual ~NonDerived() = default; };
struct Derived : T { virtual ~Derived() = default; };

public:
inline static constexpr bool value = (sizeof(NonDerived) == sizeof(Derived));
};

这应该适用于单继承和多继承。然而,当使用多重继承时,有必要列出所有的基类,像这样:

static_assert(IsEmpty<Derived, Base1, Base2, Base3>::value);

显然,此解决方案排除了 final 类。

Here's the updated demo.

<德尔> Here's the original demo. (不适用于多重继承)

关于c++ - 如何检测一个类是否有成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52207616/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com