Форум программистов, компьютерный форум, киберфорум
castaway
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Упрощенная реализация boost::any

Запись от castaway размещена 24.10.2014 в 15:29
Показов 1471 Комментарии 0

Попытка упрощения реализации boost::any без использования исключений и стандарта C++11.
Оставлена лишь минимальная функциональность.
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
#include <iostream>
#include <vector>
#include <typeinfo>
 
template <typename T> struct rem_ref      { typedef T type; };
template <typename T> struct rem_ref<T &> { typedef T type; };
 
struct any {
    any() : m_content( 0 ) {}
 
    template <typename T>
    any( const T & value ) : m_content( new holder<T>( value ) ) {}
 
    any( const any & other ) : m_content( other.m_content ? other.m_content->clone() : 0 ) {}
 
    ~any() { delete m_content; }
 
    const std::type_info & type() const {
        return m_content ? m_content->type() : typeid( void );
    }
 
private:
    struct placeholder {
        virtual ~placeholder() {}
        virtual const std::type_info & type() const = 0;
        virtual placeholder * clone() const = 0;
    };
 
    template <typename T>
    struct holder : placeholder {
        holder( const T & value ) : held( value ) {}
        virtual const std::type_info & type() const { return typeid( T ); }
        virtual placeholder * clone() const { return new holder( held ); }
        T held;
    };
 
    placeholder * m_content;
 
    template <typename T> friend T * any_cast( any * );
};
 
template <typename T>
T * any_cast( any * operand ) {
    return operand && operand->type() == typeid( T ) ? & static_cast<any::holder<T> *>(operand->m_content)->held : 0;
}
 
template <typename T>
T * any_cast_ptr_to( any & operand ) {
    return any_cast<typename rem_ref<T>::type>( &operand );
}
 
struct A {
    int val;
    A( int val ) : val( val ) {}
};
 
int main()
{
    std::vector<any> v;
 
    v.push_back( 123 );         // int
    v.push_back( 'C' );         // char
    v.push_back( 3.1415f );     // float
    v.push_back( v[0] );        // int
    v.push_back( A( 999 ) );    // A
    v.push_back( 3.1415 );      // double
 
    for ( std::vector<any>::iterator i = v.begin(); i != v.end(); ++i )
    {
        { // int
            int * p = any_cast_ptr_to<int>( *i );
            if ( p ) {
                std::cout << "int\t = " << *p << std::endl;
                continue;
            }
        }
 
        { // char
            char * p = any_cast_ptr_to<char>( *i );
            if ( p ) {
                std::cout << "char\t = " << *p << std::endl;
                continue;
            }
        }
 
        { // double
            double * p = any_cast_ptr_to<double>( *i );
            if ( p ) {
                std::cout << "double\t = " << *p << std::endl;
                continue;
            }
        }
 
        { // A
            A * p = any_cast_ptr_to<A>( *i );
            if ( p ) {
                std::cout << "A::val\t = " << p->val << std::endl;
                continue;
            }
        }
 
        std::cout << "unknown type\n";
    }
}
Источник - исходные файлы boost.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
RabbitMQ как шина данных в интеграционных решениях на C# (с MassTransit)
stackOverflow 18.04.2025
Современный бизнес опирается на множество специализированных программных систем, каждая из которых заточена под решение конкретных задач. CRM управляет отношениями с клиентами, ERP контролирует. . .
Типы в TypeScript
run.dev 18.04.2025
TypeScript представляет собой мощное расширение JavaScript, которое добавляет статическую типизацию в этот динамический язык. В JavaScript, где переменная может свободно менять тип в процессе. . .
Погружение в Kafka: Концепции и примеры на C# с ASP.NET Core
stackOverflow 18.04.2025
Apache Kafka изменила подход к обработке данных в распределенных системах. Эта платформа потоковой передачи данных выходит далеко за рамки обычной шины сообщений, предлагая мощные возможности,. . .
Коммуникация в реальном времени с SignalR в C# на примере создания чата
UnmanagedCoder 17.04.2025
Современный веб стремительно эволюционирует от статичных страниц к динамичным приложениям, где пользователи ожидают мгновенной реакции на свои действия. Представим, что вы отправляете сообщение. . .
Реализация CQRS с MediatR на C# .NET
stackOverflow 17.04.2025
Современная разработка программного обеспечения постоянно ищет пути повышения эффективности организации кода. Архитектурные паттерны появляются, эволюционируют, и те, что проявляют свою. . .
Verilog и интеллектуальная собственность - "глазами" обученной LM модели.
Hrethgir 17.04.2025
В сети встречаются участники, заявляющие что код на Verilog ни о чём не говорит. Но вот патентная практика на самом деле показывает обратное ими утверждаемому. То-есть код на Verilog включают в. . .
Свап-файл дополнительно к разделу (если вдруг не хватает или не создан)
jigi33 17.04.2025
ПОДКЛЮЧЕНИЕ ДОПОЛНИТЕЛЬНОГО SWAP ПРОСТРАНСТВА, Т. О. , РАСШИРЕНИЕ ЕГО РАЗМЕРА В Linux можно использовать как раздел подкачки (swap), так и файл подкачки (swap-файл). Чтобы создать swap-файл вместо. . .
Указатели в Swift: Небезопасные, буферные, необработанные и управляемые указатели
mobDevWorks 16.04.2025
Указатели относятся к наиболее сложным и мощным инструментам языка Swift. В своей сути указатель — это переменная, которая хранит адрес участка памяти, где расположены данные, а не сами данные. . . .
Жизненный цикл HTTP-запросов в ASP.NET Core MVC
UnmanagedCoder 16.04.2025
Разработка веб-приложений на ASP. NET MVC часто выглядит как простой процесс: получили запрос, обработали его в контроллере, отрендерили представление и отправили ответ пользователю. Однако за этой. . .
Введение в Django: Создаём приложение портфолио
py-thonny 16.04.2025
Django – один из самых мощных веб-фреймворков на Python, который позволяет быстро создавать сложные веб-приложения. В отличие от других фреймворков, Django предоставляет богатый набор встроенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер