我有一个不同类型的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本身来实现吗?
答案 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中是否存在首选解决方案,例如保护或报价模板,尽管我没有找到使用它们的适当示例。