我想制作一个“接口”/混合类(模板),并确保没有人认为添加一个成员到这个类模板是一个好主意,我想在这个条件下使用static_assert。不幸的是,std::is_empty不允许虚函数(因为多态类需要一些空间来存储它们的虚函数表指针或等效的实现细节)。
有没有一种std::is_empty的变体,允许虚函数,但不允许数据成员(或者它很容易编写)?
我希望这能起作用(加上所有我现在想不到的暗角情况):
#include <type_traits>
struct A {};
struct B : A {};
struct AA { virtual ~AA() = default; };
struct BB : AA {};
static_assert(std::is_empty_v<A>);
static_assert(std::is_empty_v<B>);
// These should also work with the replacement for is_empty:
static_assert(std::is_empty_v<AA>);
static_assert(std::is_empty_v<BB>);
int main()
{}Live demo here。
我猜它需要编译器的魔力,或者非常特定于平台的hack/check,这取决于虚拟函数是如何实现的。
发布于 2019-11-15 22:10:05
我会这样做:
struct dummy_polymorphic
{
virtual ~dummy_polymorphic() {}
};
template <typename T>
inline constexpr bool empty_maybe_polymorphic_v = std::is_empty_v<T> ||
(std::is_polymorphic_v<T> && sizeof(T) <= sizeof(dummy_polymorphic));这是我能想到的最好的方法,但它有一些局限性:
T有重复的空库,它就会崩溃:结构A{};结构B:A {};结构C: A,B{虚拟~C() {}};std::cout << sizeof(C) << '\n';// 16,而不是8
https://stackoverflow.com/questions/58876897
复制相似问题