2009-07-07 36 views
8
// BOOST Includes 
#include <boost/assign.hpp>    // Boost::Assign 
#include <boost/assign/list_of.hpp>  // Boost::Assign::List_Of 
#include <boost/assign/std/map.hpp>  // Boost::Assign::Map_List_Of 
#include <boost/tuple/tuple.hpp>  // Boost::Tuples 
// STD Includes 
#include <map> 
#include <vector> 
#include <string> 
// Using namespaces 
using namespace std; 
using namespace boost; 
using namespace boost::assign; 
// Consts 
    const map<string, string> query_map = map_list_of<string, string> 
    ("4556_SELECT_FILENAME", "SELECT FILENAME FROM Files WHERE PMU_ID = 4556") 
    ("7552_SELECT_FILENAME", "SELECT FILENAME FROM Files WHERE PMU_ID = 7552") 
    ("234x_SELECT_FILENAME", "SELECT FILENAME FROM Files WHERE PMU_ID = 2344 OR PMU_ID = 2345 OR PMU_ID = 2346 OR PMU_ID = 2347 OR PMU_ID = 2348") 
    ("813x_SELECT_FILENAME", "SELECT FILENAME FROM Files WHERE PMU_ID = 8132 OR PMU_ID = 8133 OR PMU_ID = 8134 OR PMU_ID = 8135 OR PMU_ID = 8136"); 
    const map<string, std::vector<int>> vector_map = map_list_of<string, std::vector<int>> 
    ("4556", list_of(4556)) 
    ("7552", list_of(7552)) 
    ("234x", list_of(2344)(2345)(2346)(2347)(2348)) 
    ("813x", list_of(8132)(8133)(8134)(8135)(8136)); 

Usando boost - es posible iniciar const std :: containers para pruebas, etc. haciendo un const std :: map o std :: map es bastante fácil como muestra el código anterior. Crear un const map<string, std::vector<int>> es un poco más complejo, pero aún bastante fácil.const std :: map <boost :: tuples :: tuple, std :: string>?

Estoy tratando de obtener un const std::map<boost::tuples::tuple<string, string, string>, string> pero no lo estoy inicializando. ¿Alguien más ha tenido suerte con eso?

// Typedefs 
typedef boost::tuples::tuple<string, string, string> x3_string_tuple; 
// Constants 
const map<x3_string_tuple, string> query_selector_map = map_list_of<x3_string_tuple, string> 
("4556", "SELECT", "FILENAME"), "4556_SELECT_FILENAME"); // ETC. 
+0

indicar siempre los mensajes de error que resultan de errores de compilación (si lo hay) –

Respuesta

22

Intenté esto, y falla porque las teclas del mapa deben ser comparables (con std::less, por lo que debe haber un operator< definido). Los operadores de comparación de boost::tuple se definen en el encabezado boost/tuple/tuple_comparison.hpp.

haber incluido eso, este código funciona bien:

#include <boost/assign/list_of.hpp> 
#include <boost/tuple/tuple.hpp> 
#include <boost/tuple/tuple_comparison.hpp> 
#include <map> 
#include <string> 

using std::string; 
typedef boost::tuple<string, string, string> tpl_t; 

int main() { 
    using boost::assign::map_list_of; 
    std::map<tpl_t, string> const m = 
     map_list_of(tpl_t("a","b","c"), "c")(tpl_t("x","y","c"), "z"); 
} 
+0

Wow, gracias! Esto totalmente funciona para mi –

0

me gustaría probar

const map<x3_string_tuple, string> query_selector_map = map_list_of<x3_string_tuple, string> 
(x3_string_tuple("4556", "SELECT", "FILENAME"), "4556_SELECT_FILENAME"); 

Pero, honestamente, tal vez es más fácil sólo para tener 3 listas separadas de cuerdas, y luego uno por uno los combinan en una tupla y añadir que a una mapa.

+0

Esa era mi idea inicial, pero dio lugar a una gran cantidad de errores de compilación. Adelante - mira lo que sucede. –

+0

Estaba considerando la variante de 3 listas pero no pude ver cómo se podría inicializar en 1 go con boost: asignar para que todo funcione en conjunto:/ –