Почему мы все еще программируем с плоскими файлами? [закрытый]

Я создал простой шаблонный класс streamable_enum, который использует операторы потока << и >> и основан на std::map<Enum, std::string>:

#ifndef STREAMABLE_ENUM_HPP
#define STREAMABLE_ENUM_HPP

#include <iostream>
#include <string>
#include <map>

template <typename E>
class streamable_enum
{
public:
    typedef typename std::map<E, std::string> tostr_map_t;
    typedef typename std::map<std::string, E> fromstr_map_t;

    streamable_enum()
    {}

    streamable_enum(E val) :
        Val_(val)
    {}

    operator E() {
        return Val_;
    }

    bool operator==(const streamable_enum<E>& e) {
        return this->Val_ == e.Val_;
    }

    bool operator==(const E& e) {
        return this->Val_ == e;
    }

    static const tostr_map_t& to_string_map() {
        static tostr_map_t to_str_(get_enum_strings<E>());
        return to_str_;
    }

    static const fromstr_map_t& from_string_map() {
        static fromstr_map_t from_str_(reverse_map(to_string_map()));
        return from_str_;
    }
private:
    E Val_;

    static fromstr_map_t reverse_map(const tostr_map_t& eToS) {
        fromstr_map_t sToE;
        for (auto pr : eToS) {
            sToE.emplace(pr.second, pr.first);
        }
        return sToE;
    }
};

template <typename E>
streamable_enum<E> stream_enum(E e) {
    return streamable_enum<E>(e);
}

template <typename E>
typename streamable_enum<E>::tostr_map_t get_enum_strings() {
    // \todo throw an appropriate exception or display compile error/warning
    return {};
}

template <typename E>
std::ostream& operator<<(std::ostream& os, streamable_enum<E> e) {
    auto& mp = streamable_enum<E>::to_string_map();
    auto res = mp.find(e);
    if (res != mp.end()) {
        os << res->second;
    } else {
        os.setstate(std::ios_base::failbit);
    }
    return os;
}

template <typename E>
std::istream& operator>>(std::istream& is, streamable_enum<E>& e) {
    std::string str;
    is >> str;
    if (str.empty()) {
        is.setstate(std::ios_base::failbit);
    }
    auto& mp = streamable_enum<E>::from_string_map();
    auto res = mp.find(str);
    if (res != mp.end()) {
        e = res->second;
    } else {
        is.setstate(std::ios_base::failbit);
    }
    return is;
}

#endif

Использование:

#include "streamable_enum.hpp"

using std::cout;
using std::cin;
using std::endl;

enum Animal {
    CAT,
    DOG,
    TIGER,
    RABBIT
};

template <>
streamable_enum<Animal>::tostr_map_t get_enum_strings<Animal>() {
    return {
        { CAT, "Cat"},
        { DOG, "Dog" },
        { TIGER, "Tiger" },
        { RABBIT, "Rabbit" }
    };
}

int main(int argc, char* argv []) {
    cout << "What animal do you want to buy? Our offering:" << endl;
    for (auto pr : streamable_enum<Animal>::to_string_map()) {          // Use from_string_map() and pr.first instead
        cout << " " << pr.second << endl;                               // to have them sorted in alphabetical order
    }
    streamable_enum<Animal> anim;
    cin >> anim;
    if (!cin) {
        cout << "We don't have such animal here." << endl;
    } else if (anim == Animal::TIGER) {
        cout << stream_enum(Animal::TIGER) << " was a joke..." << endl;
    } else {
        cout << "Here you are!" << endl;
    }

    return 0;
}
49
задан 3 revs 7 October 2009 в 16:05
поделиться

34 ответа

Кто работает с плоскими файлами?

Eclipse дает, Вы просматриваете в свой источник так, чтобы я видел внутренние классы, методы и данные, все отсортированные и сгруппированные. если я хочу отредактировать внутренний класс, я нажимаю на него. В то время как технически существует плоский файл, базовый, я почти никогда не перемещаюсь по нему как этот.

0
ответ дан DJClayworth 7 November 2019 в 11:09
поделиться

Одна вещь, не затронутая, состоит в том, что некоторые языки имеют понятие исходного файла, встроенного относительно вещей как переменный обзор. Изменение на что-то еще (как хранение функций в базе данных) потребовало бы, чтобы Вы изменили сам язык.

0
ответ дан MadCoder 7 November 2019 в 11:09
поделиться

При выпивании этой ночью с моими друзьями (программисты также), один из них сказал мне, что они используют UML для сгенерированного кода. Но он сказал, что они все еще должны вручную отредактировать сгенерированный код, существуют некоторые проблемные области, которые не могут быть легко описаны с UML.

Со всем LINQ-совершенством, лямбдой и всеми, некоторые проблемные области не могут быть представлены UML, мы все еще должны освободить дорогу вокруг сгенерированного кода для компьютера для выполнения наших указаний.

, Как мы могли представить в UML, уже не говоря о XML, следующей проблеме? LINQ к SQL с помощью GROUP BY и СЧИТАЮТ (ОТЛИЧНЫМИ)

сумма ответов, к которым простая проблема говорит о многом, что UML, SQL (самый важный ассемблер, независимо от того, что те парни ORM говорят Вам иначе), XML не являются суждением XOR. Мы будем все еще использовать комбинации их технология, не используя только одного из них исключая других.

0
ответ дан 2 revs 7 November 2019 в 11:09
поделиться

Это все еще плоские файлы, потому что, возможно, именно так они могут продавать программные инструменты: D

Исходный код сам должен быть объектно-ориентированным, инкапсулированным как член. Я знаю только один продукт, который это делает, он существует очень давно (Windows 3.0) и разработан самим Полом Алленом. Изначально он был вдохновлен Hypercard для Mac, но, как сказал Билл Гейтс: http://community.seattletimes.nwsource.com/archive/?date=19900522&slug=1073140

«Это поколения за пределами HyperCard», - говорит Гейтс.

К сожалению, они не нацелены на нужных людей:

Преследуя (интересы) программного обеспечения разработчиков '', - говорит Олсоп, Asymetrix мог сделать ToolBook слишком сложным для маленького парня. »

Им следовало нацелить профессиональных программистов, а не хобби.

И сегодня на концептуальном уровне он все еще превосходит другие языки, кроме Rebol, конечно;)

0
ответ дан 7 November 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: