Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518

Клонировать тип данных так, что бы в нём отсутствовал квалификатор volatile

25.12.2019, 18:02. Показов 1569. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Как изготовить мета-функцию, которая на входе получает любой тип данных, а на выходе возвращает его же, только без квалификатор volatile.

При этом, она не просто убирает квалификатор верхнего уровня, а вообще удаляет любые упоминания о нем.

Например:
Code
1
2
3
  no_volatile<volatile int>::type --> int
  no_volatile<volatile int* volatile>::type --> int*
  no_volatile<volatile int* volatile * volatile>::type --> int**
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2019, 18:02
Ответы с готовыми решениями:

И снова volatile. Глобальный массив, изменяемый в обработчике прерывания, должен быть volatile?
Всем привет. Имеется официальный код примера на чип-трансивер nrf24LE1 от Nordic. Keil C51 // Global variables uint8_t...

Проверьте проект, что в нем не так
Прикрепил два архива. В одном тестовый проект с названием Work.rar в котором все работает, и второй с названием dont work.rar в...

Заменить volatile на Thread.MemoryBarrier. Код приведён. Как оптимизировать обращения для чтения к volatile полю класса?
Не совсем понятна мне пока что работа Thread.MemoryBarrier. Знаю, что можно оптимизировать обращения к полю _cancellation, смотрел...

20
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
25.12.2019, 23:20
Первое что в голову пришло. Нужно потестить:
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
#include <iostream>
#include <string>
#include <type_traits>
 
 
template<typename T, unsigned = std::is_pointer_v<T> | (std::is_reference_v<T> << 1)>
struct recursive_remove_volatile;
 
 
template<typename T>
struct recursive_remove_volatile<T, 0u> //non pointer, non reference
{
    using type = std::remove_volatile_t<T>;
};
 
 
template<typename T>
struct recursive_remove_volatile<T, 1u> //pointer
{
    using sub_type = typename recursive_remove_volatile<std::remove_pointer_t<T>>::type;
    using type = std::conditional_t<std::is_const_v<T>, sub_type * const, sub_type *>;
};
 
template<typename T>
struct recursive_remove_volatile<T, 2u> //reference
{
    using sub_type = typename recursive_remove_volatile<std::remove_reference_t<T>>::type;
    using type = sub_type &;
};
 
 
template<typename T>
using recursive_remove_volatile_t = typename recursive_remove_volatile<T>::type;
 
 
//-----------------------------------------------------------------------------------
//вывод имени типа сделан под gcc только для этого теста
 
std::string extract_type_name(char const * n)
{
    std::string res(n);
    res.erase(0, res.find("= ") + 2);
    res.resize(res.find(";"));
    return res;
}
 
 
template<typename T>
std::string get_type_name()
{
    return extract_type_name(__PRETTY_FUNCTION__);
}
 
 
template<typename T>
void test()
{
    std::cout << get_type_name<T>() << " --> " << get_type_name<recursive_remove_volatile_t<T>>() << std::endl;
}
 
int main () 
{
    test<int>();
    test<int volatile>();
    test<int *>();
    test<int volatile *>();
    test<int volatile *>();
    test<int volatile * volatile>();
    test<int volatile * volatile * volatile>();
    test<int volatile * volatile const * volatile>();    
    test<int const volatile * volatile const &>();
}
https://wandbox.org/permlink/k9fD4lSh9lKkJDX8
int --> int
volatile int --> int
int* --> int*
volatile int* --> int*
volatile int* --> int*
volatile int* volatile --> int*
volatile int* volatile* volatile --> int**
volatile int* const volatile* volatile --> int* const*
const volatile int* const volatile& --> const int* const&
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 09:54
Цитата Сообщение от Croessmah Посмотреть сообщение
Первое что в голову пришло. Нужно потестить:
Слегка поправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T, typename = void>
struct recursive_remove_volatile
{
    using type = std::remove_volatile_t<T>;
};
 
template<typename T>
struct recursive_remove_volatile<T, std::enable_if_t<std::is_pointer_v<T>>> //pointer
{
    using sub_type = typename recursive_remove_volatile<std::remove_pointer_t<T>>::type;
    using type = std::conditional_t<std::is_const_v<T>, sub_type * const, sub_type *>;
};
 
template<typename T>
struct recursive_remove_volatile<T, std::enable_if_t<std::is_reference_v<T>>> //reference
{
    using sub_type = typename recursive_remove_volatile<std::remove_reference_t<T>>::type;
    using type = sub_type &;
};
1
26.12.2019, 10:50

Не по теме:

oleg-m1973, я почему-то вариант с enable_if отбросил. )

0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 10:54
Цитата Сообщение от Croessmah Посмотреть сообщение
oleg-m1973, я почему-то вариант с enable_if отбросил. )
На gcc можно совсем хорошо сделать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T>
struct recursive_remove_volatile
{
    using type = std::remove_volatile_t<T>;
};
 
template<typename T> requires(std::is_pointer_v<T>)
struct recursive_remove_volatile<T> //pointer
{
    using sub_type = typename recursive_remove_volatile<std::remove_pointer_t<T>>::type;
    using type = std::conditional_t<std::is_const_v<T>, sub_type * const, sub_type *>;
};
 
template<typename T> requires(std::is_reference_v<T>)
struct recursive_remove_volatile<T> //reference
{
    using sub_type = typename recursive_remove_volatile<std::remove_reference_t<T>>::type;
    using type = sub_type &;
};
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.12.2019, 11:01
oleg-m1973, концепты в следующем году подвезут, наверное.
0
26.12.2019, 11:04

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
oleg-m1973, концепты в следующем году подвезут, наверное.
Надеюсь. Хотя, gcc их уже довольно давно поддерживает, года 3 точно

0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
26.12.2019, 11:41
Цитата Сообщение от Croessmah Посмотреть сообщение
онцепты в следующем году подвезут, наверное.
А rvalue references и указатели на non-static data members завезли в 2011 и до н.э., соответственно.
Цитата Сообщение от eva2326 Посмотреть сообщение
При этом, она не просто убирает квалификатор верхнего уровня, а вообще удаляет любые упоминания о нем.
Што, даже no_volatile<void(volatile int*)>::type → void(int*)?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.12.2019, 11:42
rat0r, да, надо для rvalue-reference чуть доработать.
А остальное - вопрос не об этом же.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
26.12.2019, 12:03
Цитата Сообщение от Croessmah Посмотреть сообщение
А остальное - вопрос не об этом же.
О чём — (не) об этом? Убрать volatile из void() volatile && — не подходит под
Цитата Сообщение от eva2326 Посмотреть сообщение
вообще удаляет любые упоминания о нем
?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.12.2019, 12:10
rat0r, лучше дождаться ответа ТС.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 12:11
Цитата Сообщение от rat0r Посмотреть сообщение
О чём — (не) об этом? Убрать volatile из void() volatile && — не подходит под
C++
1
2
3
4
5
template<typename TRes, typename... TArgs>
struct recursive_remove_volatile<TRes(TArgs...), void> 
{
    using type = TRes(typename recursive_remove_volatile<TArgs>::type...);
};
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
26.12.2019, 12:13
oleg-m1973, из возвращаемого значения тоже нужно удалить. Плюс добавить специализации для работы еще с кучей разных типов. Дождемся ТСа. )
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 12:27
Цитата Сообщение от Croessmah Посмотреть сообщение
oleg-m1973, из возвращаемого значения тоже нужно удалить. Плюс добавить специализации для работы еще с кучей разных типов. Дождемся ТСа. )
Это уже детали. Базовое решение есть, развить его - не проблема, не библиотеку здесь пишем.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
26.12.2019, 12:38  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
На gcc можно совсем хорошо сделать
Ваш вариант ужассен)))

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

Во-первых, забагованный:

Code
1
error: static assertion failed: tools::no_volatile<bool&&>::type must be 'bool&&'
C++
1
2
using t = ::tools::no_volatile_t<bool&&>;
std::cout << "type = '" << tools::type_name<t>() << "'\n";
output:
Code
1
type = 'bool&'
А во-вторых, Ваш рекурсивный алгоритм не решает задачу в принципе.

Больше я не буду рассматривать некомпилябельный код.
Жаль потраченного времени.

Добавлено через 3 минуты
Цитата Сообщение от rat0r Посмотреть сообщение
Што, даже no_volatile<void(volatile int*)>::type → void(int*)?
Привет)

Цитата Сообщение от eva2326 Посмотреть сообщение
При этом, она не просто убирает квалификатор верхнего уровня, а вообще удаляет любые упоминания о нем.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 12:46
Цитата Сообщение от eva2326 Посмотреть сообщение
Даже если закрыть глаза на Вашу манеру постить некомпилирующиеся огрызки кода,
и закрыть глаза на отсутствие практической поддержки концептов.
Почему не компилируется? https://wandbox.org/permlink/CQsj7ohA5A0mzLFX

Цитата Сообщение от eva2326 Посмотреть сообщение
Во-первых, забагованный:
Код
error: static assertion failed: tools::no_volatile<bool&&>::type must be 'bool&&'
Это откуда вообще? Что-то не вижу здесь такого кода.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
26.12.2019, 13:22  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Почему не компилируется?
В исходном сообщении Вы привели огрызок кода, в котором нет ни нужных инклюдов, ни функции main, и спрашиваете: почему не компилируется?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это откуда вообще? Что-то не вижу здесь такого кода.
Это была моя адаптация.
Мне же пришлось дорабатывать ваш огрызок до компилябельного состояния.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
https://wandbox.org/permlink/CQsj7ohA5A0mzLFX
Работает неправильно:
Code
1
error: static assertion failed: recursive_remove_volatile_t<volatile bool*[1]>::type must be 'bool*[1]'
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.12.2019, 13:30
Цитата Сообщение от eva2326 Посмотреть сообщение
Работает неправильно:
Код
error: static assertion failed: recursive_remove_volatile_t<volatile bool*[1]>::type must be 'bool*[1]'
Тебе каждый тип расписать, сама не можешь догадаться, что нужно сделать?
C++
1
2
3
4
5
6
template<typename T, size_t Sz> 
struct recursive_remove_volatile<T[Sz]> 
{
    using sub_type = typename recursive_remove_volatile<T>::type;
    using type = sub_type[Sz];
};
Добавлено через 48 секунд
main и инклуды написать к этому огрызку?
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
26.12.2019, 13:42  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Тебе каждый тип расписать
Что мне точно не нужно: так это некомпилябельные, забагованные или недоделанные огрызки.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
29.12.2019, 16:24
Croessmah, oleg-m1973, когда свои некомпилябельные, забагованные и недоделанные огрызки допишете? «Взялся за гуж…», как говорится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2019, 16:24
Помогаю со студенческими работами здесь

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

Что такое void и volatile?
Всем привет :) Уже 2 недели по немного изучаю С по книге Герберта Шилдта. Дошел до 48 страницы (из 800 всей книги) Все оказалось очень...

Сделать так что бы на событие mouseEnter реагировал только canvas, но не реагировали находящиеся в нем компонеты
вдруг &lt;Canvas.Triggers&gt; &lt;EventTrigger RoutedEvent=&quot;Canvas.MouseEnter&quot;&gt; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru