Форум программистов, компьютерный форум CyberForum.ru

Создать список ф-ций определяемых в файле (а-ля initializer list) в compile time - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Контроль звуковых потоков http://www.cyberforum.ru/cpp/thread1626276.html
Всем привет,не знал,где разместить тему,т.к вроде тема не для новичков,но на эксперта не тянет. Проблема следующая,необходимо получить доступ к различным потокам выхода с возможностью их редактирования. Под выходными потоками я имею ввиду все те варианты взаимодействия компьютера с внешним миром(выхдной звуковой поток,http запросы от браузера,поток картинки на главном и побочных экранах)
C++ Электронная сваха: составить счастливый набор пар 2 задание: «Электронная сваха». Имеется N мужчин и N женщин. Имеются также данные о предпочтениях каждого мужчины по отношению к каждой женщине. Аналогичные данные имеются и для женщин. Требуется составить такой набор пар, чтобы общество, получившееся из таких семей, было максимально счастливым помогите решить, я не знаю как...я опустил руки( http://www.cyberforum.ru/cpp/thread1625591.html
C++ Linux Bash: ./main.o: Отказано в доступе
Установил библиотеку sfml через apt-get, вставил тестовый код, в терминале прописал путь, далее g++ -c main.cpp, скомпилировалось, пишу ./main.o выкидывает ошибку: bash: ./main.o: Отказано в доступе. Даже под рутом не работает.
C++ Перезаписывать index.html каждый раз, когда меняется количество файлов в директории
нужно сделать так, чтобы каждый раз когда меняется количество файлов в каталоге C:\\, программа перезаписывала файл index.html #include <stdio.h> #include <iostream> #include <windows.h> #include <fstream> using namespace std; int main() {
C++ Сделать валидатор http://www.cyberforum.ru/cpp/thread1622460.html
Здравствуйте, уважаемые) На форуме только поселился, если кто-то может помочь, то буду очень благодарен) К сожалению, я не очень силен(надеюсь, что пока), в регулярных выражениях, да и с qt мало поработал, вопрос может показаться глупым, но ближе к делу) Задача: написать валидатор, вводить можно строку - стока с указанием единиц измерения, к примеру 25645км_35м, где "_" - это пробел. Все это...
 

Показать сообщение отдельно
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
29.12.2015, 23:13     Создать список ф-ций определяемых в файле (а-ля initializer list) в compile time
Kastaneda, в общем, вот такая вот наркомания:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <cstdint>
#include <vector>
#include <algorithm>
 
constexpr uint32_t ct_hash_suffix(char c, size_t seed)
{
    return static_cast<uint32_t>(c) + uint32_t(0x9e3779b9) + (seed << 6) + (seed >> 2);
}
 
uint32_t hash_value(std::string const & str)
{
    uint32_t seed = 0;
    for(char c : str)
    {
        seed ^= ct_hash_suffix(c, seed);
    }
    return seed;
}
 
constexpr uint32_t ct_hash(char const * str, uint32_t seed = 0)
{
    return *str ? ct_hash(str + 1, seed ^ ct_hash_suffix(*str, seed)) : seed;
}
 
template <uint32_t File, typename F>
class FunctionStorage
{
    template <typename FS>
    struct ResultOf;
 
    template <typename R, typename ...A>
    struct ResultOf<R(A...)>
    {
        using type = R;
    };
 
    using RetType = typename ResultOf<F>::type;
 
    struct Caller
    {
        RetType operator()(F f) const
        {
            return f();
        }
    };
 
public:
    static FunctionStorage & instance()
    {
        static FunctionStorage inst;
        return inst;
    }
 
    F * add(F * func)
    {
        m_funcs.push_back(func);
        return func;
    }
 
    F * operator[](size_t idx)
    {
        return m_funcs[idx];
    }
 
    std::vector<RetType> callAll() const
    {
        std::vector<RetType> ret(m_funcs.size());
        std::transform(m_funcs.begin(), m_funcs.end(), ret.begin(), Caller());
        return ret;
    }
 
private:
    std::vector<F *> m_funcs;
};
 
template <uint32_t File, typename FuncType>
class FunctionRegister
{
public:
    FunctionRegister(FuncType * f)
        : m_func(FunctionStorage<File, FuncType>::instance().add(f))
    { }
 
    FuncType * operator~() const
    { return m_func; }
 
private:
    FuncType * m_func;
};
 
#define REGISTERED_VALUES() \
    FunctionStorage<ct_hash(__FILE__), std::string()>::instance().callAll()
 
#define FUNCTION_DECL(F) \
    std::string(*F)() = ~(FunctionRegister<ct_hash(__FILE__), std::string()>)[]
 
 
/* Функции определяем так: */
FUNCTION_DECL(a)() -> std::string
{
    return "a";
};
FUNCTION_DECL(b)() -> std::string
{
    return "b";
};
 
int main()
{
   /* в зависимости от места вызова будет давать разные результаты
       например, для файла с функциями a.cpp будет один список, для файла b.cpp - другой.
       можно добавить еще один вариант, который принимает имя файла в качестве параметра
       тогда можно будет запрашивать списки, задавая нужный файл
   */
    auto v = REGISTERED_VALUES();
 
    for(auto & c : v)
        std::cout << c << std::endl;
}
http://rextester.com/QTPEI24794
Ни в коем случае не законченное решение, а скорее эксперимент. Но продолжать мне лень, но есть пара мыслей.
Что здесь плохо:
1) Хэш времени компиляции ненадежен. Можно заменить на полноценные compile-time строки в качестве уникального тега файла, но код станет более сложным и пример перестанет быть демонстрационным. В любом случае, если интересно, то могу поделиться своими наработками в этой области.
2) Даже со строками вместо хешей, будут коллизии в общем случае. Т.к. файлы в проекте теоретически могут называться одинаково. Я считаю, что на общий случай распространить решение не получится.
3) Функции на самом деле не функции, а указатели на функции, следовательно могут возникнуть проблемы при необходимости использовании внешнего связывания (как вариант, можно воспользоваться сишным приемом "extern указатель на функцию", для использования в других единицах трансляции).
4) std::vector внутри хранилища зарегистрированных функций. Пока что не вижу разумных вариантов этого избежать.
5) Невозможность обобщить решение на любые функции: с любым количеством параметров и типов возвращаемого значения. Для этого скорее всего придется что-то сильно менять, текущий вариант этого не позволит в полной мере.

В любом случае, баловаться таким в реальных проектах я бы не советовал.
Это же ужас что. Кто потом это будет поддерживать?!
Однако, возможно какие-то идеи окажутся полезными и ты решишь написать свой вариант на базе них, который будет более соответствовать задаче (более узкоспециализированным) и окажется более безопасным и простым из-за этого.
 
Текущее время: 18:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru