Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2016, 11:22   #1
progerer
 
Регистрация: 28.05.2015
Сообщений: 3
По умолчанию Контейнер аля Tuple - C++

Добрый день.
Есть работающий код:
Код:
#include <iostream>
#include <map>
 
enum Index
{
    First,
    Second,
    Third
};
template<int> struct Helper{};
 
template<int ckey, typename T>
class Hash
{
public:
    Hash(const T &value) : _value(value) {}
 
    template<int key>
    inline T at() { return _at(Helper<key>{}); }
protected:
 
    template<int key>
    inline int _at(Helper<key>) { static_assert(key == ckey, "Передан неизвестный ключ!"); return -1; }
 
    virtual inline T _at(Helper<ckey>) { return _value; }
private:
    const T _value;
};
 
template<int key1, typename T1, int key2, typename T2>
class Hash2 : public Hash<key2, T2>
{
public:
    Hash2(const T1 &value1, const T2 &value2) : Hash<key2, T2>(value2), _value(value1) {}
 
    template<int key>
    inline auto at() { return _at(Helper<key>{}); }
private:
    const T1 _value;
 
    template<int key>
    inline T2 _at(Helper<key> value) { return Hash<key2, T2>::_at(value); }
 
    inline T1 _at(Helper<key1>) { return _value; }
};
 
int main()
{
    static Hash2<First, std::string, Second, std::map<double, double>> hash(std::string("qwerty"), {{1.2, 1.6}, {2.1, 2.3}});
    std::cout << hash.at<Second>().at(2.1) << std::endl;
    return 0;
}
Пока что это два различных класса. Хочется из них сделать один универсальный класс-контейнер аля std::tuple, но вместо типов использовать целочисленные индексы (например определенные в enum). Фактически получается примитивный хеш. Т.е. чтобы было нечто такое:
Код:
enum Keys
    {
        KeyOne,
        SuperKey,
        DuperKey,
        SuperDuperKey,
        Trololo
    };
 
static Hash<KeyOne, SuperKey, DuperKey, SuperDuperKey, Trololo> hash(std::string("Qwerty"), true, 100500, 12.12, std::map{{1.2, 1.6}, {2.1, 2.3}});
std::cout << hash.at<DuperKey>() << std::endl; // 100500
Возможно такое?

PS STL, Boost и прочее не годится. Только голый C++.
progerer вне форума Ответить с цитированием
Старый 12.08.2016, 18:26   #2
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

А с каких это пор нельзя добраться до элемента tuple по индексу?
Код:
#include <iostream>
#include <string>
#include <tuple>
 
int main()
{
    auto t = std::make_tuple(1, "Foo", 3.14);
    // Доступ по индексу
    std::cout << "(" << std::get<0>(t) << ", " << std::get<1>(t)
              << ", " << std::get<2>(t) << ")\n";
    // Доступ по типу
    std::cout << "(" << std::get<int>(t) << ", " << std::get<const char*>(t)
              << ", " << std::get<double>(t) << ")\n";
}

// cout: (1, Foo, 3.14)
// cout: (1, Foo, 3.14)
Зачем велосипедить, когда всё есть в std.
http://en.cppreference.com/w/cpp/utility/tuple/get
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сюжет аля сталкер (выживание) Arigato Свободное общение 96 19.11.2014 12:58
Кнопки аля CodeGear Style Риндера Компоненты Delphi 3 08.11.2010 12:51
ListBox аля проводник Dimakat Общие вопросы Delphi 4 07.09.2010 23:49
edit-фильтр аля Google 1sal1 Помощь студентам 2 07.07.2008 23:16
edit с фильтром аля Google 1sal1 БД в Delphi 1 07.07.2008 20:34