我怎么能写一个像MPL那样有效的元函数?

时间:2013-08-21 22:39:20

标签: c++ templates boost template-meta-programming boost-mpl

在尝试编写调用MPL代码的元函数时,我似乎错过了一些东西。以下代码无法在inst2上编译时出现以下错误,但在inst1上工作正常:

错误C2903:'apply':symbol既不是类模板也不是函数模板

using namespace boost::mpl;

template <typename VECTOR>
struct first_element : mpl::at_c<VECTOR, 0> {};

int main()
{
    typedef vector<
        vector<int, int>,
        vector<int, int>,
        vector<int, int>> lotso;

    typedef mpl::transform<lotso,
        first_element<_1>>::type inst1;

    typedef first_element<
        at_c<lotso,0>>::type inst2;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为您在::type的typedef中忘记了at_c后面的inst2。回想一下,您的first_element期望可以应用at_c的内容。但是,原始at_c<lotso, 0>尚未评估。通过添加::type来评估元功能。

#include <boost/mpl/vector.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/mpl/placeholders.hpp>
#include <type_traits>

using namespace boost;
using namespace boost::mpl;

template <typename VECTOR>
struct first_element : mpl::at_c<VECTOR, 0> {};

int main()
{
    typedef vector<
        vector<int, int>,
        vector<int, int>,
        vector<int, int>> lotso;

    typedef mpl::transform<lotso,
        first_element<_1>>::type inst1;

    typedef first_element<
        at_c<lotso,0>::type >::type inst2;
                     ^^^^^^ <--- you forgot a ::type here

    static_assert(std::is_same<first_element<inst1>::type, inst2>::value, "bingo");

    return 0;
}

Live Example。作为进一步检查,我确认inst1上的进一步解除引用与inst2的类型相同。