我试图在 Boost.Proto 中创建一个匹配 vector 类型的语法,但是当我给它一个该类型的终端时,它与语法不匹配。类型定义如下所示:
template <typename T, unsigned D>
struct vector
{
typedef T scalar;
enum { size = D };
scalar& operator[](unsigned i)
{
return m_components[i];
}
scalar const& operator[](unsigned i) const
{
return m_components[i];
}
private:
scalar m_components[size];
};
我试图匹配的语法看起来像这样:
namespace proto = boost::proto;
using proto::_;
using proto::N;
struct test:
proto::terminal<vector<_, N> >
{};
匹配失败:
int main ()
{
BOOST_MPL_ASSERT((proto::matches<proto::terminal<vector<float, 2> >::type, test>));
}
如何制作匹配特定类型的语法?
编辑:
proto::_ 和 proto::N 似乎没有在自定义类型中用作通配符。代码确实使用此语法编译(匹配
断言通过):
struct test:
proto::terminal<vector<float, 2> >
{};
但是当任一通配符属于以下类型时不起作用:
struct test:
proto::terminal<vector<float, N> >
{};
或者:
struct test:
proto::terminal<vector<_, 2> >
{};
因此,如果我不能使用我自己的类型的通配符,我该如何测试表达式是否是包含 vector 的终端?
最佳答案
要将终端中的类型与类型进行比较,您可以使用类型特征。如果给定类型是 vector ,我设置了一些特征结构,这些结构评估为真:
template <typename T>
struct is_vector:
boost::mpl::false_
{};
template <typename T, unsigned Size>
struct is_vector <dev::math::vector <T, Size> >:
boost::mpl::true_
{};
然后你可以把这个放在你的语法中:
proto::and_<
proto::terminal<_>,
proto::if_<is_vector<proto::_value>()>
>
我以前尝试过这种方法,但它不起作用的原因是我在 traits 结构所在的 header 中的错误命名空间中转发声明了 vector<...>。
关于c++ - 将 Boost.Proto 语法与类型匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6480032/