为每个和自由功能提升mpl

时间:2011-12-02 02:15:06

标签: c++ templates boost boost-mpl

为什么这段代码无法编译:

#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>
#include <iostream>

using namespace std;
using namespace boost;

template <class T>   // specific visitor for type printing
static void print_type(T t)
    {
        std::cout << typeid(T).name() << std::endl;
    }


typedef mpl::vector<int, long, char*> s;
int main ()
{
    mpl::for_each<s>(print_type());
}

我想知道 - 如何使用同一类中的自由函数使boost mpl for_each工作?

2 个答案:

答案 0 :(得分:4)

如上所述,你需要一个仿函数。

下面的代码包含一个额外的包装模板,允许打印仿函数处理引用。

#include <iostream>
#include <typeinfo>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/placeholders.hpp>

using namespace std;
using namespace boost;

template <typename T>
struct wrap {};

struct print_type
{
    template< typename T>
    void operator()( wrap<T> ) const
    {
        cout << typeid(T).name() << "\n";
    }
};

typedef mpl::vector<int, long&, char*> s;

int main ()
{
    mpl::for_each<s, wrap<mpl::placeholders::_1> >(print_type());
    return 0;
}

注意:此代码基于David Abrahams和Aleksy Gurtovoy撰写的“C ++模板元编程”一书中的示例

答案 1 :(得分:3)

    mpl::for_each<s>(print_type());

这在某些方面是错误的。

首先,print_type是一个返回void的函数。 print_type()试图调用该函数。由于它不返回任何内容,因此您无法将其不存在的返回值保留在其他内容中。

其次,print_type模板功能。如果不指定模板参数,则无法调用模板函数。所以print_type()格式不正确。

第三,即使mpl::for_each<s>(print_type)也不起作用,因为print_type不是值(也不能转换为值);它是一个模板。您不能将模板作为函数的参数传递。这就是为什么访问者(对很多东西,不仅仅是MPL)是对象,可以有operator()个成员。