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

Union, new placement, strict-aliasing, cross-platform - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ База данных жителей страны http://www.cyberforum.ru/cpp/thread1398296.html
Добрый день. Помогите сделать БД на с++. Вот само задание: База данных жителей страны. Поля: имя, город, возраст, IQ, рост. Сортировка по возрасту, вывод информации по имени. Нужно сделать функции добавления, редактирования, просмотра и сортировки.А сохраняться все должно в типизированный файл. Буду рад любой помощи.
C++ С++ - map с указателями на функции и функции в классе Сразу скажу, не уверен, что это возможно осуществить моим способом и прошу указать мою ошибку или показать другое решение близкое к моему.. В общем мне нужно создать map с ключом string, а значением должен быть указатель на функцию. Затем этот список и функции поместить в класс. Вот моё ваяние: class coms { public: map <string, void(*)()> comlist = { { "loop", loopper }, { "woop",... http://www.cyberforum.ru/cpp/thread1397704.html
C++ Есть ли исходники SpyEye в открытом доступе?
Здравствуйте, форумчане! Можно ли уже спустя 2-3 года найти творение Gribodemon'a с названием SpyEye в открытом доступе? Есть желание покопаться в исходниках, поучиться программировать.
C++ Измените dll
Здравствуйте. Не знаю, в тот ли раздел попал или нет, извиняйте))) Требуется помощь. Мои знания в программировании близки к нулю, поэтому решил обратиться к профессионалам.) Итак, есть файл .dll. В этом файле прописан путь к звуковому воспроизведению в игре. Другими словами заходишь в игру и появляется голос, означающий, что файл dll успешно загружен и готов к работе. Необходимо каким-то...
C++ Ошибка компиляции http://www.cyberforum.ru/cpp/thread1395376.html
Дана задача с использованием friend-ов. Не могу понять почему программа не видит (Square s(5, 4);) Помогите пожалуйста чайнику) #include<iostream> using namespace std; class Square{ private: int width; int lenght; public:
C++ Записать текст с переносами в string C++ Здравствуйте! Возникла такая проблема, не могу записать текст из файла в переменную типа string. Через getline() считывается только одна строка, какие существуют альтернативные способы? Что бы потом иметь возможность удалять из считанного текста определённые слова. Заранее спасибо подробнее

Показать сообщение отдельно
hoggy
5719 / 2310 / 417
Регистрация: 15.11.2014
Сообщений: 5,157
Завершенные тесты: 1

Union, new placement, strict-aliasing, cross-platform - C++

18.03.2015, 22:03. Просмотров 333. Ответов 5
Метки (Все метки)

Доброго времени суток.

Ниже представленный код вроде бы работает.
Гонял его на компиляторах cl/mingw

http://rextester.com/OGKQ63240

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
//Title of this code
//g++  4.8.2
 
#include <iostream>
#include <cassert>
 
#include <type_traits>
 
 
struct IResource
{ 
    virtual void Foo()const =0; 
};
 
struct Resource: IResource
{ 
    virtual void Foo()const { std::cout<<"[ Resource ] hello\n"; }
};
 
 
union Holder
{
private:
    static void dimmy(){}
    typedef void (*unspecified)();
    
    char       mBuf[sizeof(IResource)];
    IResource* mHelper;
    
public:
    
    Holder():mHelper(nullptr){}
    
    IResource& Get()
    { 
        assert( mHelper && "ERROR: Holder is empty" );
        
        //промежуточная переменная служит для предотвращения угрозы
        //dereferencing type-punned pointer will break strict-aliasing rules
        IResource* obj = reinterpret_cast<IResource*>(mBuf);
        return *obj;
    }
    
    
    // true, если пуст
    bool Empty()const 
        { return mHelper? false: true; }
    
    // true, если пуст
    bool operator !()const 
        { return Empty(); }
   
    // true, если ресурс захвачен
    operator unspecified()const 
        { return !Empty()? dimmy: nullptr; }
    
 
    template<class T> void Capture()
    {
        static_assert( std::is_base_of<IResource, T>::value,
            "ERROR: T MUST BE THE HEIR OF THE CLASS 'IHelper'");
        
        static_assert( sizeof(T) == sizeof(IResource),
            "ERROR: SIZE OF T MUST BE == sizeof(IHelper)");
        
        new (mBuf) T;
    }
    
    void Clear() { mHelper = nullptr; }
    
    void View()const
    {
        std::cout << "addr = " << mHelper << mHelper << " : ";
        for(char i: mBuf)
            std::cout<<(int)i<<" ";
        std::cout<<'\n';
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Holder holder;
    holder.View();
    
    std::cout<<"holder is empty ? (must be true) : "
        << !holder<<'\n';
    
    holder.Capture<Resource>();
    holder.View();
    
    std::cout<<"holder is empty ? (must be false) : "
        << !holder<<'\n';
 
    std::cout<<"access to the resource:\n";
    holder.Get().Foo();
    
    std::cout<<"clear...\n";
    holder.Clear();
    
    std::cout<<"holder is empty ? (must be true) : "
        << !holder<<'\n';
    
}
Вопрос следующий: могу ли я закладываться на работоспособность метода
bool Holder::Empty()const ?

Другими словами, может ли теоретически так получится,
что валидный полиморфный объект окажется состоящим из одних нулей?


Кликните здесь для просмотра всего текста
Пожалуйста, не нужно обращать моё внимание на то,
что деструктор захваченного ресурса вызван не будет.
Так специально задумано.

Наследники не имеют права иметь собственных членов.
И static_assert это проконтролирует.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru