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

Во время компиляции определить, является ли тип полным - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Автоматическое формирование html – страниц, c++ http://www.cyberforum.ru/cpp/thread1380386.html
Добрый день!!! Передо мной стоит следующая задача - создать программу, которая автоматически закачивает указанную пользователем страницу из интернета, модифицирует её и, затем, открывает в браузере. В качестве модификации можно выбрать любое небольшое предложение (например, "Добрый день!"). Данная программа должна быть реализована в пакете VS 2010 express. Заранее всем спасибо!
C++ Cast from const_iterator to iterator Доброго времени суток. Существует ли способ просто и быстро вытащить итератор из константного итератора? Вариант с distance не предлагать. Нужен быстрый способ. Пробовал так: http://www.cyberforum.ru/cpp/thread1380038.html
Adobe Flash Player (src) C++
Форумчане, кто-нибудь из вас натыкался на исходники флеш плеера? Если да, то можете их скинуть? Просто адобе свой 11 флеш выкладывали в опен сорс когда-то, а я проворонил этот момент)
C++ [trigraph] Как отключить? Как устранить триграф из литерной константы?
Доброго времени суток. Сборка Debug при помощи mingw482_32. Возникла проблема с триграфами. Вообще то, я всегда думал, что триграфы по дефолту отключены. Но у меня они почему то оказались включенными. В связи с этим два вопроса: 1. Каким волшебным ключиком компилятора деактивировать?
C++ Построение libjpeg-turbo http://www.cyberforum.ru/cpp/thread1379484.html
проблемы с построением libjpeg-turbo http://sourceforge.net/projects/libjpeg-turbo/ скачал сорцы, выполнил cd {build_directory} cmake -G "Visual Studio 10" {source_directory} создались файлы проекта. но при сборке пишет что не может открыть simd\MinSizeRel\jsimdcpu.obj
C++ Неразрешенный внешний символ "__imp__closesocket@4 Пишу вот такой код: #include <Winsock2.h> #include <errno.h> #include <string> enum CONNECTION_STATUS { CONNECTION_STATUS_OK, подробнее

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

Во время компиляции определить, является ли тип полным - C++

24.02.2015, 01:56. Просмотров 406. Ответов 5
Метки (Все метки)

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

Это уже моя далеко не первая попытка создать детектор неполных типов.

Требуется кросс-платформа: сl/mingw/gcc/clang

Моя последняя самая успешная модель не проходит всех тестов.
Она не в состоянии однозначно определить полный ли тип, или не полный,
и имеет на выходе 3 ответа: да, нет, не знаю.

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

Я использовал множество разных трюков,
что бы добиться положительного результата,
но пока безрезультатно.

Ниже представленный код - ещё одна из попыток.
Но возникла непредвиденная проблема.

Мне не понятно, почему этот код вообще скомпилировался???????

http://rextester.com/TJSW25522


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
#include <type_traits>
 
//Здесь используется модель класса "IsValidExpression"
//Ссылка на первоисточник, и большое спасибо автору за идею:
//http://habrahabr.ru/post/112239/
 
//Примечание: авторский код не безупречен
//содержит технические ошибки, и фейлит многие тесты
 
#define SHECK_VALID_EXPRESSION( dNAME, dEXPRESSION ) \
template< class T > class dNAME                      \
{                                                    \
    struct no{};                                     \
    template< class U >                              \
        static decltype( dEXPRESSION )               \
            test( void* );                           \
    template< class U >                              \
        static no test( ... );                       \
    typedef decltype( test<T>(nullptr) )             \
        result;                                      \
public:                                              \
    enum { value =                                   \
        !std::is_same<no, result>::value };          \
};
 
 
#include <iostream>
#include <utility>
 
struct nocomplete;
struct complete{};
 
typedef std::pair<double, nocomplete>
    pair_nocomplete;
 
typedef std::pair<int, complete>
    pair_complete;
 
 
//-----------------------------------------------
template<class T> void fake(T);
SHECK_VALID_EXPRESSION( IsComplete, fake(U()) );
//-----------------------------------------------
 
int main()
{
    std::cout<<"WELLCOME TO EXAMPLE APPLICATION!\n";
    
    //электроны изменяют своё поведение в зависимости от того, 
    //наблюдает ли кто за ними
    
    std::cout<<"is complete 'nocomplete' ? (must be 0) - "
        << IsComplete<nocomplete>::value<<'\n';
 
    std::cout<<"is complete 'complete' ? (must be 1) - "
        << IsComplete<complete>::value<<'\n';
 
    // Ошибка: "эффект электрона". 
    // Если закомментировать отладочный вывод для pair_nocomplete, 
    // то поведение изменится и станет корректным
    
    std::cout<<"is complete 'pair_nocomplete' ? (must be 0) - "
        << IsComplete<pair_nocomplete>::value<<'\n';
 
    std::cout<<"is complete 'pair_complete' ? (must be 1) - "
        << IsComplete<pair_complete>::value<<'\n';
        
    
    // не полный тип не может быть создан.
    // такое странное поведение наблюдается 
    // только на компиляторах вижал студии
    
    pair_nocomplete pr;  //<--- what the fuck ???????
    pr.second = 20;      
 
    std::cout<<"first = "  << pr.first  <<'\n'; 
    std::cout<<"second = " << pr.second <<'\n'; 
    
    // тип second почему то интерпритируется, как тип int
    // если расскоментировать, получим ошибку:
    // error C2062: type 'int' unexpected
    //std::cout<<"type of second = " << decltype(pr.second).name() <<'\n'; 
    
    //Предварительное заключение:
    //  каким то образом, инстанцирование IsComplete<pair_nocomplete>::value
    //  приводит к сбою в работе компилятора.
    
}
Кто нибудь может объяснить, что за чертовщина с этим кодом творится?
И как это лечить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru