Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Выброс static_assert в failure SFINAE

29.12.2015, 16:23. Показов 2467. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,

Пролог:
куда я только static_assert не пихал)))

Проблема:
Ошибка error C2794: 'type': is not a member of any direct or indirect base class of 'std::enable_if<false,void>' не интуитивная, хочу добавить читаемости проблеме через static_assert.


Подразумивается, что редактировать можно с 30 по 40 строку.

Код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
//////////////////////////////////////////////////////////////////////////
namespace SFINAE
{
    template <typename T>
    struct IsHasOperatorLess
    {
        typedef char( &No )[3];
 
        template <class U>
        static auto check( const U* u ) -> decltype(*u < *u, true)
        {
        };
        static No check( ... )
        {
            
        };
        enum
        {
            Is = (sizeof( check( (T*)0 ) ) == sizeof( true )),
        };
       
 
    };
}
//////////////////////////////////////////////////////////////////////////
 
template < class Derived,
    typename std::enable_if< 
    SFINAE::IsHasOperatorLess<Derived>::Is 
    ? true 
    //: ( static_assert(false, "Main<Derived> :: Derived should had operator<"), false ) 
    : false
                            >::type* = nullptr >
struct Main
{
    
};
 
//////////////////////////////////////////////////////////////////////////
 
class Foo
{
public:
    //bool operator<( const Foo& right ) const   {   return true;  }
};
 
//////////////////////////////////////////////////////////////////////////
 
int main()
{
    Main<Foo> a;    
}



Вопросы:
1) Разве сравнение разименованых указателей *u < *u это не рантайм? Или компилятор пока строит код под сравнение шаблонных u, якобы должен заметить или не заметить, что такой перегрузки не сущестует?
2) Почему с 34 проблемы? Даже если привести static_assert к (void) ?
3) Как добавить читаемости проблеме об отсуствии operator< через static_assert
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2015, 16:23
Ответы с готовыми решениями:

C++11 - std::forward и static_assert
Привет. Эта тема создана в познавательных целях. А именно, мне не совсем понятна реализация шаблонной функции std::forward. Вот так она...

Ошибка в static_assert: выражение не определяется константой
template&lt;class T&gt; int fff(T v) { static_assert(typeid(T) == typeid(double), &quot;not accepted function argument type&quot;); return 0.; ...

Как работает шаблон структуры static_assert?
Всем привет, объясните пожалуйста подробно почему данный код не компилируется? #include &lt;iostream&gt; ...

22
27.01.2016, 21:51
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Мне до таких тем еще расти и расти
О том же подумал, просматривая тему... Магия какая-то. А люди её как-то понимают.

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.01.2016, 23:26
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А есть способ обойти это?
Ну ты понял почему не работает-то?
Если, при использовании CRTP, в контексте каких-либо проверок наследник имеет полный тип, то все будет нормально (например в функции класса Main или в static_assert в теле). Если нет, то никак ты не обойдешь.
В твоем примере ты говоришь: давай Main проверит есть ли в Foo оператор<. Если Main пытается сделать эту проверку на этапе построения типа (как у тебя), то попытка обречена на провал. Ведь чтобы проверить оператор, нужен полностью построенный тип. Но Main - это часть типа Foo. Получается, чтобы построить тип, нужно построить тип - мистика.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.01.2016, 00:36  [ТС]
DrOffset, ааа. Чтобы дать определение сущности Main, надо разобраться с сущностью CRTP, а та при использовании поймет что Main не полный. И никак это не обойти ведь в определении Main сам CRTP с его traits
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2016, 00:36

Static_assert для сравнения адресов объектов
Привет. Бывают такие случаи, когда вроде и понимаешь, но всё-равно что-то не получается... Почему в одном случае static_assert...

SFINAE не работает
Почему conversion operator не хочет работать ни так #include &lt;iostream&gt; #include &lt;type_traits&gt; class C { public: ...

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

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

Посоветуйте задания по SFINAE
Добрый день, посоветуйте примеры заданий(само ТЗ задания, не код), которые вы бы решили/решали с помощью SFINAE. Последние задания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru