c++ - 将 Boost.Proto 语法与类型匹配

标签 c++ boost expression-templates boost-proto

我试图在 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/

相关文章:

C++ 模板 typedef 作为模板函数参数

c++ - C#相当于C++中的ifstream/ofstream

c++ - 如何围绕表达式模板编写第三方库包装类

c++ - 在表达式模板中嵌套子表达式

c++ - 在 Cairo Surface 之前创建 Pango 布局

c++ - volatile 是在 C/C++ 中生成单字节原子的正确方法吗?

c++ boost写入内存映射文件

c++ - 决定在运行时使用boost::static_vector或std::vector

c++ - 如何从我的 boost/lib 文件夹中获取特定的库?

c++ - C++ 表达式模板的教程和介绍