确定boost变量中的最大sizeof()

Mat*_*t K 4 c++ templates boost-variant boost-mpl c++11

鉴于:

boost::variant<T1,T2,T3,...,TN>
Run Code Online (Sandbox Code Playgroud)

在编译时计算以下内容:

max(sizeof(T1), sizeof(T2), sizeof(T3),... ,sizeof(TN))
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个,但这个答案揭示了我如何开始.使用两个类型的答案中的代码,T1并且T2,我可以在源文件中使用以下内容来获取更大对象的大小:

size_t largestSize = sizeof(largest<T1, T2>::type);
Run Code Online (Sandbox Code Playgroud)

这正是我想要做的,但我需要largest模板来处理两个以上的类 - 具体来说,它需要检查存储在boost::variant对象中的所有类型.

我知道boost::variant有一个typestypedef,它定义了变体中某种类型的列表.问题是,当我试图绕过实现中的所有boost::mpl内容时,我完全迷失了.我不直观地了解什么boost::variant::types 的,我如何能够将它传递到我自己的模板做了它.

在我看来,这是最终实现的样子:

typedef boost::variant<T1, T2, T3, T4> MyVariant;
size_t largestSize = sizeof(largest<MyVariant::types>::type);
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何实现这个版本largest.

我不确定这是否是一种合理的方法,所以我愿意接受任何其他方法来实现这一点(可能boost::static_visitor在编译时应用于所有类型?).

Bar*_*rry 7

只是忽略mpl的东西.从...开始:

template <class T> struct max_variant_sizeof;

template <class... Ts>
struct max_variant_sizeof<boost::variant<Ts...>> {
    static constexpr size_t value = variadic_max(sizeof(Ts)...);
};
Run Code Online (Sandbox Code Playgroud)

现在max_variant_sizeof<MyVariant>::value将所有类型的所有大小转发到函数.你需要做的就是写下variadic_max:

constexpr size_t variadic_max(size_t v) { return v; }

template <class... Args>
constexpr size_t variadic_max(size_t a, size_t b, Args... cs)
{
    return variadic_max(std::max(a, b), cs...);
}
Run Code Online (Sandbox Code Playgroud)

在C++ 14之前,std::max()不是constexpr,所以可以替换为:

    return variadic_max((a > b ? a : b), cs...);
Run Code Online (Sandbox Code Playgroud)

有一点值得注意:

也许boost::static_visitor在编译时应用于所有类型?

使用a进行访问variant是一个运行时操作 - 您的访问者将使用variant恰好保留的类型进行调用.不会使用所有类型调用它.