给定一个类,我想在编译时找到最大的 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::string
,BIGGEST_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/