c++ - 如何找到最大可能的子类(class)

标签 c++ templates visual-c++ variadic-templates template-meta-programming

给定一个类,我想在编译时找到最大的 sizeof() 它的所有子类。在这种情况下,您需要正确定义 B::BIGGEST_TYPE_SIZE 的值,最好是在类本身中。

如最后一行所示,可以使用 std::max() 在单独的代码块中执行此操作,但它有些重复代码且不优雅,因为我随着更多类从 B 继承,将不得不不断修改该行。

我想要一个很好的可扩展解决方案。

struct B 
{
    static const int BIGGEST_TYPE_SIZE;
};

struct D1 : public B
{
    int i;
};

struct D2 : public B
{
    std::vector<int> vec;
};

struct D3 : public B
{
    std::string s;
};

const int B::BIGGEST_TYPE_SIZE = std::max(sizeof(D1), std::max(sizeof(D2), sizeof(D3)));

由于 std::stringBIGGEST_TYPE_SIZE 的值应为“32”。

对此有什么优雅的解决方案吗? 模板越性感越好。 谢谢!

最佳答案

std::variant为例,它从模板参数中知道它的大小。你最好的办法也是使用可变参数模板。首先,你实现 the variadic max function template ,然后你使用它:

template <typename ... Ts>
constexpr bool biggest_size_v = max(sizeof(Ts)...);

如果您要求在编译时自动获取所有派生类的列表。你不能。您仍然需要列出它们:

const int B::BIGGEST_TYPE_SIZE = biggest_size_v<D1, D2, D3>;

关于c++ - 如何找到最大可能的子类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56507931/

相关文章:

c++ - 如何正确初始化模板类型的成员变量?

c++ - 具有非专用模板参数的虚拟方法

java - 为桌面应用程序选择语言

c++ - 在 C/C++ 中求解非线性反抛物线 PDE 的包

c++ - 什么是 "stack alignment"?

c++ - 使用 ffmpeg 解码 Wma

c++ - 在 VS 2005 中仅转储部分内存

c++ - 动态 C++ 函数参数

json - 具有多个结构的 golang 模板

c++ - 缩短C++中二维动态数组算法的周期