gpt4 book ai didi

c++ - 将 mpl::fold 与占位符和我自己的结构事故一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 12:06:33 26 4
gpt4 key购买 nike

我有以下主模板:

template<size_t pos, size_t lev>
struct Sol;

我专门针对一些 pos 值,如下所示:

template<size_t lev>
struct Sol<0, lev>
{
static const mpl::vector_c<size_t, 4, 6> jumps;
static const size_t value =
mpl::fold<jumps, mpl::integral_c<size_t, 0>,
mpl::plus<Sol<_1, lev-1>::value,
Sol<_2, lev-1>::value> >::type::value;
}

但我明白了 Sol预计 size_t得到了mpl_::_1 .我知道在这种情况下,我可能会忽略我试图做的这件折叠事情,而只是将值(value)声明为其他两个低一级值(value)的总和 Sol pos 的结构4 和 6.. 但我想知道如果 vector_c 是否可以修复打字有点长?

谢谢..

最佳答案

下面的代码会做你想做的。我做了一些改变。

首先,我用 mpl::integral_c 包装了 pos 非类型模板参数。通常,在使用 Boost.MPL 时,建议包装所有非类型模板参数。这样,您以后就不必区分它们了。

其次,我使用了模板元函数转发。这意味着我不是在 Sol 中定义模板数据成员 value,而是简单地从包含它的 Boost.MPL 模板派生 Sol值(value)。这将节省您到处输入 ::type::value 的时间。使用良好的缩进使代码更易于阅读。

第三,我使用 boost::mpl::lambda 将您对 mpl::plus 的调用包装在 mpl::fold 中。这对于您提供的代码来说并不是绝对必要的,但是如果您在另一个带有其他占位符参数的 mpl::fold 表达式中使用 Sol 本身(lambda 包装将延迟评估,直到整个模板被解析)。

第四,我进行了完全特化以停止对您的 lev 参数的递归。顺便说一句,如果您开始在 lev 上进行编译时计算,同样的建议也适用:首先将其包装到 mpl::integral_c 中。

#include <boost/mpl/fold.hpp>
#include <boost/mpl/integral_c.hpp>
#include <boost/mpl/lambda.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/vector_c.hpp>

namespace mpl = boost::mpl;
using namespace mpl::placeholders;

// primary template
template<typename pos, size_t lev>
struct Sol;

// partial specialization for zero position
template<size_t lev>
struct Sol< mpl::integral_c<size_t, 0>, lev>
:
mpl::fold<
mpl::vector_c<size_t, 4, 6>,
mpl::integral_c<size_t, 0>,
mpl::lambda<
mpl::plus<
Sol<_1, lev-1>,
Sol<_2, lev-1>
>
>
>
{};

// full specialization for zero position and level
template<>
struct Sol< boost::mpl::integral_c<size_t, 0>, 0>
:
boost::mpl::integral_c<size_t, 0> // or whatever else you need
{};

关于c++ - 将 mpl::fold 与占位符和我自己的结构事故一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com