首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有像is_empty_but_has_virtual_functions这样的东西?

有没有像is_empty_but_has_virtual_functions这样的东西?
EN

Stack Overflow用户
提问于 2019-11-15 20:16:16
回答 1查看 119关注 0票数 3

我想制作一个“接口”/混合类(模板),并确保没有人认为添加一个成员到这个类模板是一个好主意,我想在这个条件下使用static_assert。不幸的是,std::is_empty不允许虚函数(因为多态类需要一些空间来存储它们的虚函数表指针或等效的实现细节)。

有没有一种std::is_empty的变体,允许虚函数,但不允许数据成员(或者它很容易编写)?

我希望这能起作用(加上所有我现在想不到的暗角情况):

代码语言:javascript
复制
#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,这取决于虚拟函数是如何实现的。

EN

回答 1

Stack Overflow用户

发布于 2019-11-15 22:10:05

我会这样做:

代码语言:javascript
复制
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));

这是我能想到的最好的方法,但它有一些局限性:

  • 我们假设一个类的多态开销总是相同的(通常是一个非常安全的假设,除非你的类由于多重继承而以几个vtable指针结束)。我看不到任何方法来摆脱这个限制。
  • 如果T有重复的空库,它就会崩溃:

结构A{};结构B:A {};结构C: A,B{虚拟~C() {}};std::cout << sizeof(C) << '\n';// 16,而不是8

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58876897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档