为什么这段代码无法编译:
#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工作?
答案 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()
个成员。