将Boost.Proto语法与类型匹配
Matching a Boost.Proto grammar to a type
我试图在Boost.Proto中创建一个匹配向量类型的语法,但当我给它一个该类型的终端时,它与语法不匹配。类型定义如下:
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似乎没有在自定义类型中用作通配符。代码使用以下语法进行编译(matches
断言通过):
struct test:
proto::terminal<vector<float, 2> >
{};
但当任意一个通配符的类型为时,它就不起作用
struct test:
proto::terminal<vector<float, N> >
{};
或者:
struct test:
proto::terminal<vector<_, 2> >
{};
所以,如果我不能在自己的类型中使用通配符,我该如何测试表达式是否是包含向量的终端?
要将终端中的类型与类型进行比较,可以使用类型特征。我设置了一些特征结构,如果给定的类型是向量,则这些特征结构会评估为真:
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结构位于。
Boost.Proto不适用于非类型模板参数。如果可以的话,可以将向量类型更改为使用积分类型包装器,如下所示:
template <typename T, typename D>
struct vector
{
typedef T scalar;
enum { size = D::value };
scalar& operator[](unsigned i)
{
return m_components[i];
}
scalar const& operator[](unsigned i) const
{
return m_components[i];
}
private:
scalar m_components[size];
};
然后你应该能够匹配如下:
int main ()
{
BOOST_MPL_ASSERT((proto::matches<
proto::terminal<vector<float, mpl::int_<2> > >::type,
proto::terminal<vector<_, _> >
>));
}
希望能有所帮助!
相关文章:
- 赋值到类型和空大括号. 语法说明
- 模板<>模板<类型名 T> 语法有什么用?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 截至 C++14 起尾随返回类型语法的合法使用
- 正确语法,用于统一初始化名称中带有空格的类型的临时,如unsigned int
- 使用 pybind11 绑定 typedef 类型的正确语法是什么?
- 使用函数类型语法声明成员函数
- 应用于类型别名声明的 [[maybe_unused]] 属性的语法
- 将任何类型的表达式放在 c++ 的初始化列表中在语法上是否正确?
- C 语法,根据此代码返回值类型
- 返回类型布尔函数中的声明语法错误
- 函数模板专用化语法聚合模板化类型
- 是否可以在尾随返回类型语法中直接使用参数值(不是其类型,而是值本身)
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 嵌套模板类返回类型在 C++ 中的头文件中函数返回类型的语法
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法
- typedef T类型::*语法
- 由于noexcept说明符,尾随返回类型语法失败
- Int (Int, Int)样式模板函数类型语法