ved*_*ity 10 c++ boost expression-templates boost-proto
我正在尝试在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];
};
Run Code Online (Sandbox Code Playgroud)
我试图匹配的语法看起来像这样:
namespace proto = boost::proto;
using proto::_;
using proto::N;
struct test:
proto::terminal<vector<_, N> >
{};
Run Code Online (Sandbox Code Playgroud)
比赛失败:
int main ()
{
BOOST_MPL_ASSERT((proto::matches<proto::terminal<vector<float, 2> >::type, test>));
}
Run Code Online (Sandbox Code Playgroud)
如何制作与特定类型匹配的语法?
编辑:
似乎proto :: _和proto :: N在自定义类型中不用作通配符.代码用这个语法编译(matches断言传递):
struct test:
proto::terminal<vector<float, 2> >
{};
Run Code Online (Sandbox Code Playgroud)
但是当其中任何一个通配符属于该类型时,它都不起作用:
struct test:
proto::terminal<vector<float, N> >
{};
Run Code Online (Sandbox Code Playgroud)
要么:
struct test:
proto::terminal<vector<_, 2> >
{};
Run Code Online (Sandbox Code Playgroud)
因此,如果我不能使用我自己的类型的通配符,我如何测试表达式是否是包含向量的终端?
要将终端中的类型与类型进行比较,可以使用类型特征.我有一些特征结构设置,如果给定的类型是向量,则评估为true:
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_
{};
Run Code Online (Sandbox Code Playgroud)
然后你可以把它放在你的语法中:
proto::and_<
proto::terminal<_>,
proto::if_<is_vector<proto::_value>()>
>
Run Code Online (Sandbox Code Playgroud)
我之前尝试过这种方法,但之所以没有用,是因为我在特征结构所在的标题中的错误名称空间中转发了声明的向量<...>.
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];
};
Run Code Online (Sandbox Code Playgroud)
然后你应该能够匹配如下:
int main ()
{
BOOST_MPL_ASSERT((proto::matches<
proto::terminal<vector<float, mpl::int_<2> > >::type,
proto::terminal<vector<_, _> >
>));
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
752 次 |
| 最近记录: |