Я использую boost fusion. Я хочу объявить функцию шаблона, которая назначает поле карты и выполняет различные другие функции. Я не могу, чтобы жизнь меня определяла, как получить тип элемента, хранящегося на карте fusion ::. Я уверен, что это возможно - я просто не могу понять документацию. Я думаю, что у меня есть две проблемы:Как я могу получить тип значения в boost :: fusion :: map?
- не может иметь правильные заголовки включен - компилятор жалуется на неполную типа: повышение :: фьюжн :: Расширение :: value_of_data_impl
- Я не совсем ясно, как 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 в данном примере).
В соответствии с docs 'value_of_data' используется только для итераторов. Я думаю, что metafunction вы хотите 'value_at_key'. Если это, пожалуйста, ответьте на вопрос, потому что я не могу на данный момент. – llonesmiz