Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 06.03.2019
Сообщений: 13
1

Шаблон, который показывает можно ли сложить все элементы tuple

07.12.2019, 01:51. Просмотров 1108. Ответов 6

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

Но мало того, что мне нужно как то пройтись по всему tuple, мне еще как то понимать в каких случаях элементы приводятся и могут будить просуммированы, а какие нет .

ДУмаю, что нужно использовать std::type_traits, decltype, std::declval, std::conjunction, на ум больше ничего не приходит, других пояснений мне не дали, если кто разбирается в этой теме, помогите пожалуйста


это все, что есть из моих наработок, последний шаблон не валиден (это скорее то, как я думаю, оно должно быть).
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include<tuple>
#include<type_traits>
 
template<class T>
struct can_sum_pair : std::false_type {};
 
template<class T>
struct can_sum_tuple : std::false_type {};
 
template<class Head, class... Tail>
struct can_sum_tuple<std::tuple<Head, Tail...>> : std::conjunction<typename Head == decltype(std::declval<Head>() + std::declval<Tail>())) {};
Добавлено через 10 минут
Я посидел еще немного и пришел к этому

C++
1
2
3
4
5
6
7
8
9
#pragma once
#include<tuple>
#include<type_traits>
 
template<class T>
struct can_sum_tuple : std::false_type {};
 
template<class Head, class... Tail>
struct can_sum_tuple<std::tuple<Head, Tail...>> : std::conjunction<std::is_same<Head, decltype((T)(std::declval<const Tail&>()))>>... > {};
Но мне почему не хочется проверять работает ли оно вообще)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2019, 01:51
Ответы с готовыми решениями:

SFML - ошибка "std::tuple<sf::RenderWindow>::tuple: ни одна из 2 перегрузок не может преобразовать все типы аргументов"
Хотел создать поток, передаю в функцию переменную window, где хранится игровое окно. При...

Нужен ComboBox, который показывает отфильтрованные вводной строкой элементы
Нужно что-то типа комбобокса, чтобы при вводе искало в списке и показывало только те, где есть...

Сложить элементы массива с произведением элементов столбца, который содержит минимальный элемент
Вывести двумерный массив A, вывести его. Преобразовать исходный массив путем сложения его элементов...

Движок CMS , который можно настроить шаблон!
ПОДСКАЖИТЕ Движок CMS , который можно настроить шаблон! Чтобы можно было полностью изменить внешний...

6
4576 / 3079 / 1286
Регистрация: 07.05.2019
Сообщений: 9,512
Записей в блоге: 1
07.12.2019, 12:01 2
Лучший ответ Сообщение было отмечено DmitryK_ как решение

Решение

Цитата Сообщение от DmitryK_ Посмотреть сообщение
Здравствуйте, мне в вузе поставили задачу реализовать шаблон, который будет проходится по tuple и искать предикат - можно ли сложить первый элемент со втором, первый с третьим ... и так далее.
Что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <typename T1, typename T2, typename = std::void_t<>> struct _IsSummable: std::false_type {}; 
template <typename T1, typename T2> struct _IsSummable<T1, T2, std::void_t<decltype(T1() + T2())>>: std::true_type {}; 
 
template <typename...> struct IsSummable;
 
template <typename T1>
struct IsSummable<T1>
{
    static const bool value = _IsSummable<T1, T1>::value;
};
 
template <typename T1, typename T2, typename... TT>
struct IsSummable<T1, T2, TT...>
{
    static const bool value = _IsSummable<T1, T2>::value && IsSummable<T2, TT...>::value;
};
 
template <typename... TT> struct IsSummable<std::tuple<TT...>>: IsSummable<TT...> {}; 
 
static_assert(IsSummable<int, double, char>::value);
static_assert(IsSummable<std::tuple<int, double, char>>::value);
static_assert(!IsSummable<int, std::string>::value);
static_assert(!IsSummable<std::tuple<int, std::string>>::value);
0
Эксперт С++
8175 / 3774 / 813
Регистрация: 15.11.2014
Сообщений: 8,580
07.12.2019, 13:35 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
_IsSummable
UB.


17.6.4.3.2 Global names
Certain sets of names and function signatures are always reserved to the implementation:
— Each name that contains a double underscore __ or begins with an underscore followed by an uppercase
letter (2.12) is reserved to the implementation for any use.
— Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.
0
4576 / 3079 / 1286
Регистрация: 07.05.2019
Сообщений: 9,512
Записей в блоге: 1
07.12.2019, 13:45 4
Цитата Сообщение от hoggy Посмотреть сообщение
UB.
UB??? И каким же образом имя класса, да ещё шаблонного, может вызвать неопределённое поведение в рантайме?
Ну, и оно как-то неплохо попадает под второй пункт этих рекомендаций, не говоря о том, что никакой речи про UB там не идёт. Просто какие-то соглашения по именам.
0
Эксперт С++
8175 / 3774 / 813
Регистрация: 15.11.2014
Сообщений: 8,580
07.12.2019, 18:42 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
UB??? И каким же образом имя класса, да ещё шаблонного, может вызвать неопределённое поведение в рантайме?
почитай что такое UB.

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

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
оно как-то неплохо попадает под второй пункт этих рекомендаций
стандарт не делает никаких рекомендаций.

в данном случае он ясно даёт понять,
что подчеркивание и верхний регистр зарезерварованны для нужд языка.
и не должно использоваться ни в каких других случаях.
0
4576 / 3079 / 1286
Регистрация: 07.05.2019
Сообщений: 9,512
Записей в блоге: 1
07.12.2019, 18:50 6
Цитата Сообщение от hoggy Посмотреть сообщение
в данном случае он ясно даёт понять,
что подчеркивание и верхний регистр зарезерварованны для нужд языка.
и не должно использоваться ни в каких других случаях.
Да ладно, какие-такие нужды языка? Стандартная библиотека - это нужда языка или просто одна из многих библиотек, которые я могу подключать или не подключать?
Где в языке используются имена, начинающиеся с подчёркивания? Ни одного не вижу https://en.cppreference.com/w/cpp/keyword
0
Эксперт С++
8175 / 3774 / 813
Регистрация: 15.11.2014
Сообщений: 8,580
07.12.2019, 19:00 7
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Да ладно, какие-такие нужды языка?
ты читать что ли не умеешь?
Цитата Сообщение от hoggy Посмотреть сообщение
is reserved to the implementation for any use.
или просто не понял смысла написанного?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Стандартная библиотека - это нужда языка или просто одна из многих библиотек, которые я могу подключать или не подключать?
стандартная библиотека - часть языка.

что именно ты будешь с нею делать никого не волнует.
что за вопрос такой странный?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Где в языке используются имена, начинающиеся с подчёркивания?
да где угодно.
открой реализацию стандартной библиотеки.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2019, 19:00

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

Сложить все элементы массива
Всем привет, как сложить все элементы массива? искал на просторах интернета, но всё очень сложно и...

Сложить все элементы в массиве
народ, кому не сложно, нужен код на vbs который заполнит массив случайными значениями, сложит все...

Сложить все элементы последовательности
Вот собствено условие. Даны целые числа N (&gt; 2), A и B. Сформировать и вывести целочисленный...

Сложить все элементы массива
function assa() { var a = new Array(4,2,3,6,10); var i; var sun; for(i=0;i &lt; a.length;i++) {...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.