Я знаю о value_type, key_type … но они работают с типами, а не с экземплярами.
Я старался
такие вещи, как:
std::set<uint64_t> mySet;
decltype (mySet)::value_type pos;
Но это не работает.
РЕДАКТИРОВАТЬ: я использую VS 2010.
РЕДАКТИРОВАТЬ 2: целью этого кода было получить тип, чтобы дать ему boost :: lexical_cast<>
Есть ли обходной путь, который позволяет это?
Я хочу что-то вроде этого:
mySet.insert(boost::lexical_cast<decltype(mySet)::value_type>(*it));
// it is a iterator in vector of strings
EDIT3: это работает:
mySet.insert(boost::lexical_cast<decltype(mySet)::value_type>(*it));
decltype (mySet)::value_type
верно. Убедитесь, что в вашем компиляторе включен режим C ++ 11. Если да, то это ошибка компилятора.
Возможный обходной путь включает использование метафункции идентичности:
template <typename T>
struct identity { typedef T type; };
identity<decltype(mySet)>::type::value_type pos;
Я бы сделал это наоборот:
typedef std::set<uint_least64_t> set_type;
set_type mySet;
set_type::value_type pos;
Вот простой пример метода печати, который печатает элементы очереди с приоритетами:
template<typename T> void print_queue(T& queue) {
while (!queue.empty()) {
std::cout << queue.top() << " ";
queue.pop();
}
std::cout << '\n';
}
Проблема в том, что после печати всех элементов очередь пуста.
Для восстановления очереди в исходное состояние мы добавляем векторный контейнер. Тип
элементов очереди выводится из очереди:
template<typename T> void print_queue(T& queue) {
std::vector<T::value_type> vec;
while (!queue.empty()) {
std::cout << queue.top() << " ";
vec.push_back(queue.top());
queue.pop();
}
std::cout << '\n';
for (auto & v : vec) {
queue.push(v);
}
}