2016-12-01 3 views
2

Я использую boost fusion. Я хочу объявить функцию шаблона, которая назначает поле карты и выполняет различные другие функции. Я не могу, чтобы жизнь меня определяла, как получить тип элемента, хранящегося на карте fusion ::. Я уверен, что это возможно - я просто не могу понять документацию. Я думаю, что у меня есть две проблемы:Как я могу получить тип значения в boost :: fusion :: map?

  1. не может иметь правильные заголовки включен - компилятор жалуется на неполную типа: повышение :: фьюжн :: Расширение :: value_of_data_impl
  2. Я не совсем ясно, как use result_of, value_of_data и т. д.

Чтобы это было действительно специфично, минимальный тестовый пример показан ниже.

#include <string> 
#include <boost/shared_ptr.hpp> 
#include <boost/fusion/include/container.hpp> 
#include <boost/fusion/container.hpp> 
#include <boost/fusion/iterator.hpp> 

using std::string; 

using namespace boost; 

namespace fields { 
    struct rgb; 
    struct gray; 
    struct keypoints; 
    struct edges; 
    struct objects; 
} 

typedef fusion::map< 
    fusion::pair<fields::rgb,  string>, 
    fusion::pair<fields::gray,  int>, 
    fusion::pair<fields::keypoints, int>, 
    fusion::pair<fields::edges,  int>, 
    fusion::pair<fields::objects, double> 
> Fields; 

Fields A_map; 

template<typename field> 
void Add(fusion::result_of::value_of_data<field> data) { 
    fusion::at_key<field>(A_map) = data; 
} 

int main() { 
    Add<fields::gray>(123); 
} 

Функция добавления должна быть объявлена ​​получить аргумент, который является типом серого поля (INT в данном примере).

+0

В соответствии с docs 'value_of_data' используется только для итераторов. Я думаю, что metafunction вы хотите 'value_at_key'. Если это, пожалуйста, ответьте на вопрос, потому что я не могу на данный момент. – llonesmiz

ответ

2

@jv да, это точно ответ. Огромное спасибо.

Я использую фьюжн в течение нескольких часов и не нашел этого в документации (поскольку функции на итераторах видны на верхнем уровне, тогда как value_at_key появляется только при выкапывании в последовательность/внутреннюю/metafunctions)

Также мне нужно было использовать typename и рассчитан на более простые включения. Исправленный код:

#include <string> 
#include <boost/fusion/include/sequence.hpp> 
#include <boost/fusion/include/map.hpp> 

using std::string; 

using namespace boost; 

namespace fields { 
    struct rgb; 
    struct gray; 
    struct keypoints; 
    struct edges; 
    struct objects; 
} 

typedef fusion::map< 
    fusion::pair<fields::rgb,  string>, 
    fusion::pair<fields::gray,  int>, 
    fusion::pair<fields::keypoints, int>, 
    fusion::pair<fields::edges,  int>, 
    fusion::pair<fields::objects, double> 
> Fields; 

Fields A_map; 

template<typename field> 
void Add(typename fusion::result_of::value_at_key<Fields, field>::type data) { 
    fusion::at_key<field>(A_map) = data; 
} 
+0

Не забудьте принять свой собственный ответ (используя зеленую отметку). – llonesmiz