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

C++ 在boost MPL序列中搜索具有boost占位符的类型,c++,boost,template-meta-programming,C++,Boost,Template Meta Programming,我有一个不同类型的boost mpl向量,我想知道该向量中是否有一种特定类型。但该类型包含一个模板参数,它是一个boost占位符(我以后要替换它) 代码: #定义BOOST\u MPL\u LIMIT\u VECTOR\u大小20 #定义BOOST\u MPL\u LIMIT\u MAP\u大小20 #包括 #包括 #包括 #包括 名称空间bmpl=boost::mpl; 模板 结构BSI{ typedef typename Out::FrameType FrameType; }; int ma

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

#定义BOOST\u MPL\u LIMIT\u VECTOR\u大小20
#定义BOOST\u MPL\u LIMIT\u MAP\u大小20
#包括
#包括
#包括
#包括
名称空间bmpl=boost::mpl;
模板
结构BSI{
typedef typename Out::FrameType FrameType;
};
int main(){
型BSI足;
typedef bmpl::vectorvec;
typename bmpl::find_if::type x;
}

问题是:Boost似乎被占位符弄糊涂了,并试图应用我的占位符。当然,我可以编写自己的占位符和应用程序,但boost本身可以这样做吗?

需要注意的是,boost占位符不是boost MPL的“实现”细节,而是为使用而设计的:

然而,这里观察到的行为似乎是意料之中的:他们有一个例子:

mpl::multiplies<
    mpl::plus<_1,_2>,
    mpl::minus<_1,_2>
>
mpl::乘法<
mpl::plus,
mpl::减号
>
因此,解决方案似乎是将有问题的类用引号括起来(如评论中所述),如:

模板
结构报价{
使用类型=T;
}

我仍然不确定boost MPL中是否有像protect或quote模板这样的首选解决方案,尽管我没有找到使用它们的适当示例。

如果您是说您正在使用boost MPL的实现细节来实现自己的元编程库语义,你得到了你应得的:/Boost MPL可能允许你“引用”占位符,但我不会指望它(考虑到MPL的年龄和受支持的平台),我想在事后使用Boost::apply on foot。这就是boost占位符的作用,不是吗?除非你现在也希望将它们视为非魔法实体。不是这个就是那个。您可能可以使用自己的普通引号:
template struct quoted{typedef T type;}并在“步行申请”时解包:
mpl::multiplies<
    mpl::plus<_1,_2>,
    mpl::minus<_1,_2>
>
template<class T>
struct Quote{
    using type = T;
}