每个函数和自由函数的 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 与同一类中的自由函数一起工作?
Why this code does not compile:
#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());
}
I wonder - how to make boost mpl for_each work with free functions from same class?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如前所述,您需要一个函子。
下面的代码包含一个额外的换行模板,允许打印函子处理引用。
注意:此代码基于 David Abrahams 和 Aleksy Gurtovoy 所著的《C++ 模板元编程》一书中的示例
As stated you need a functor.
The code below includes an additional wrap template that allows the print functor to cope with references.
Note: this code based on examples in the book 'C++ Template Metaprogramming by David Abrahams and Aleksy Gurtovoy
这在几个方面是错误的。
首先,
print_type
是一个返回void
的函数。print_type()
是调用该函数的尝试。由于它不返回任何内容,因此您不能将其不存在的返回值粘贴到其他内容中。其次,
print_type
是一个模板函数。如果不指定模板参数,则无法调用模板函数。所以print_type()
的格式不正确。第三,即使
mpl::for_each
(print_type)也不起作用,因为print_type
不是一个值(也不能转换为一个值);它是一个模板。您不能将模板作为函数的参数传递。这就是为什么访问者(对于很多事情来说,不仅仅是 MPL)是对象,它可以具有模板operator()
成员。This is wrong in a couple of ways.
First,
print_type
is a function that returnsvoid
.print_type()
is an attempt to call that function. Since it returns nothing, you can't stick its non-existent return value into something else.Second,
print_type
is a template function. You cannot call a template function without specifying the template parameters. Soprint_type()
is ill-formed.Third, even
mpl::for_each<s>(print_type)
doesn't work, becauseprint_type
is not a value (nor is it convertible to a value); it is a template. You cannot pass a template as the argument of a function. That's why visitors (for many things, not just MPL) are objects, which can have templateoperator()
members.