【问题标题】:Search a boost MPL sequence for a type with a boost placeholder在 boost MPL 序列中搜索具有 boost 占位符的类型
【发布时间】:2015-06-02 14:34:26
【问题描述】:

我有一个不同类型的 boost mpl 向量,想知道该向量中是否有一种特定类型。但是该类型包含一个模板参数,它是一个 boost 占位符(我想在之后替换它)
代码:

#define BOOST_MPL_LIMIT_VECTOR_SIZE 20
#define BOOST_MPL_LIMIT_MAP_SIZE 20
#include <boost/typeof/std/utility.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/contains.hpp>

namespace bmpl = boost::mpl;

template< class In, class Out = bmpl::_1 >
struct BSI{
    typedef typename Out::FrameType FrameType;
};

int main(){
    typedef BSI<float> foot;
    typedef bmpl::vector< int, foot > vec;
    typename bmpl::find_if< vec, bmpl::same_as<foot> >::type x;
}

问题是:Boost 似乎对占位符感到困惑,并尝试应用我的占位符。当然,我可以编写自己的占位符和应用程序,但是这可以通过 boost 本身实现吗?

【问题讨论】:

  • 如果您的意思是您将 Boost MPL 的实现细节用于您自己的元编程库语义,那么您得到了应得的:/ Boost MPL 可能允许您“引用”这个地方-持有人,但我不会指望它(考虑到 MPL 的年龄和支持的平台)
  • 之后我想步行使用 boost::apply。这就是 boost 占位符的用途,不是吗?
  • 除了您现在还想将它们视为非魔法实体。这是一个或另一个。您可能可以使用自己的琐碎报价:template&lt;typename T&gt; struct quoted { typedef T type; }; 并在您要“步行申请”时解压:)

标签: c++ boost template-meta-programming


【解决方案1】:

需要注意的是,Boost 占位符不是 Boost MPL 的“实现”细节,而是实际设计用于使用:http://www.boost.org/doc/libs/1_58_0/libs/mpl/doc/refmanual/apply.html

然而,这里观察到的行为似乎是意料之中的:http://www.boost.org/doc/libs/1_57_0/libs/mpl/doc/tutorial/placeholders.html 他们有一个例子:

mpl::multiplies<
    mpl::plus<_1,_2>,
    mpl::minus<_1,_2>
>

所以解决方案似乎是将有问题的类包装在引号中(如 cmets 中所述),例如:

template<class T>
struct Quote{
    using type = T;
}

我仍然不确定 boost MPL 中是否有首选的解决方案,例如保护或引用模板,尽管我没有找到合适的使用示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多