Почему знание типа исчезает с Boost :: MPL? - PullRequest
1 голос
/ 01 мая 2011

У меня есть следующий код, и он отлично работает.

#include <boost\mpl\vector.hpp>
#include <boost\mpl\fold.hpp>
#include <boost\mpl\for_each.hpp>
#include <boost\mpl\inherit.hpp>
#include <boost\mpl\inherit_linearly.hpp>
#include <iostream>

using namespace boost::mpl::placeholders;

typedef boost::mpl::vector<short[2], long, char*, int> member_types;

template <typename T>
struct wrap
{
    T value;
};

struct print
{
    template <typename T>
    void operator()(T) const
    {
        std::cout << typeid(T).name() << std::endl;
    }
};

typedef boost::mpl::inherit_linearly<member_types, boost::mpl::inherit<wrap<_2>, _1> >::type Generate;

void main()
{
    Generate generated;
    print p;

    std::cout << static_cast<wrap<int>&>(generated).value << std::endl;

    boost::mpl::for_each<member_types>(p);
}

но если я изменю это так:

struct print
{
    Generate generated;
    template <typename T>
    void operator()(T) const
    {
        std::cout << static_cast<wrap<int>&>(generated).value << std::endl;
    }
};

Я получаю ошибку ошибка C2440: «static_cast»: невозможно преобразовать из «const Generate» в «wrap &» с помощью [ Т = INT ]

Почему это работает в основном, но не, если я помещаю это в модуль? Как я могу получить данные в месте, где я могу использовать значение данных, созданных списком типов, для вызова последовательностью шаблонных функций, управляемых списком типов. В основном, как мне сделать объект, который делает что-то полезное с двумя частями?

1 Ответ

3 голосов
/ 01 мая 2011

Если вы измените operator() в print на следующее, вероятно, код может быть скомпилирован:

struct print {
    ...
    void operator()(T) // remove const

или

static_cast<wrap<int>const&>(generated) // add const
...