在boost MPL序列中搜索具有boost占位符的类型

时间:2015-06-02 14:34:27

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

我有一个不同类型的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本身来实现吗?

1 个答案:

答案 0 :(得分:0)

值得注意的是,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>
>

所以解决方案似乎是用引号(如评论中所提到的)包装有问题的类,如:

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

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