每个函数和自由函数的 Boost mpl

发布于 2024-12-19 06:23:57 字数 525 浏览 0 评论 0原文

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

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷离° 2024-12-26 06:23:57

如前所述,您需要一个函子。

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

#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++ 模板元编程》一书中的示例

As stated you need a functor.

The code below includes an additional wrap template that allows the print functor to cope with references.

#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;
}

Note: this code based on examples in the book 'C++ Template Metaprogramming by David Abrahams and Aleksy Gurtovoy

呆° 2024-12-26 06:23:57
    mpl::for_each<s>(print_type());

这在几个方面是错误的。

首先,print_type 是一个返回void 的函数。 print_type() 是调用该函数的尝试。由于它不返回任何内容,因此您不能将其不存在的返回值粘贴到其他内容中。

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

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

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

This is wrong in a couple of ways.

First, print_type is a function that returns void. 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. So print_type() is ill-formed.

Third, even mpl::for_each<s>(print_type) doesn't work, because print_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 template operator() members.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文