const std :: map <boost :: tuples :: tuple, std :: string>?

// 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));

Использование boost - можно запустить const std :: container для тестирования и т. Д. сделать const std :: map или std :: map довольно просто, как показывает приведенный выше код. Созданиеconst map<string, std::vector<int>> немного сложнее - но все же довольно легко.

Я пытаюсь придуматьconst std::map<boost::tuples::tuple<string, string, string>, string> но я не могу его инициализировать. Кому-нибудь еще повезло с этим?

// 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.
 Johannes Schaub - litb08 июл. 2009 г., 00:22
Пожалуйста, всегда включайте сообщения об ошибках, которые являются результатом ошибок компиляции (если есть)

Ответы на вопрос(2)

Решение Вопроса

Я попытался это, и это не удается, потому что ключи карты должны быть сопоставимы (сstd::lessТаким образом, должно бытьoperator< определены).boost::tupleоператоры сравнения определены в заголовкеboost/tuple/tuple_comparison.hpp.

Включив это, этот код работает нормально:

#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");
}
 08 июл. 2009 г., 06:49
Вау, спасибо! Это полностью работает для меня

я бы попробовал

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");

Но, честно говоря, может быть, проще иметь 3 отдельных списка строк, а затем один за другим объединять их в кортеж и добавлять это на карту.

 07 июл. 2009 г., 23:31
Это была моя первоначальная мысль, но это привело к большому количеству ошибок компиляции. Давай - посмотри, что получится.
 07 июл. 2009 г., 23:33
Я рассматривал вариант с 3 списками, но не смог понять, как его можно инициализировать за 1 раз с boost: assign, чтобы все это работало вместе: /

Ваш ответ на вопрос