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

[дизайн и эволюция] провалы в variadic конструкторы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывести 10 самых длинных (по числу символов) предложений http://www.cyberforum.ru/cpp/thread1637394.html
Ребят программисты помогите, понимаю что программа легкая. Но не могу сделать. Текст надо считать из файла.
C++ Найти причины и способы устранения ошибки Во время откладки указатель на число выдает мусор типо -81791524 #include <stdlib.h> #include <time.h> #include <iostream> #include <conio.h> #include <cctype> using::std::cin; using::std::cout; using::std::endl; http://www.cyberforum.ru/cpp/thread1637383.html
Как лучше всего пробежать все элементы контейнера? C++
Речь о следующем. Есть vector. Я хочу пробежать все его элементы, но походу я буду проверять удовлетворяют они определенному условию или нет. Если да, то этот элемент удаляется. Как это лучше всего реализовать?
C++ Найти сумму ряда
Ребят, голову ломаю и никак не осилю. В чем смысл вообще? Я понять формулу даже не могу, не то что уж код написать здесь. Какие-то "-...+". Что это вообще? Помогите кто чем может.
C++ Вычислить произведение отрицательных элементов массива http://www.cyberforum.ru/cpp/thread1637347.html
Приветствую вас дорогие форумчане. Прошу о помощи в изменении программы. В коде предоставленном ниже требуется заменить: рандомный подбор чисел на вводимый. Зарание спасибо! (Текст задания: В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1.) произведение отрицательных элементов массива; 2.) сумму положительных элементов массива, расположенных до максимального элемента....
C++ Реализовать структуру "Student" Создайте программу для ввода и вывода фамилий и оценок студентов. Введите не менее 10 студентов. Отберите студентов, у которых вторая и четвертая оценка 2 подробнее

Показать сообщение отдельно
hoggy
5995 / 2435 / 436
Регистрация: 15.11.2014
Сообщений: 5,398
Завершенные тесты: 1
13.01.2016, 20:26  [ТС]     [дизайн и эволюция] провалы в variadic конструкторы
Цитата Сообщение от Kastaneda Посмотреть сообщение
а для чего 2 раза remove_reference в этих конструкциях
когда то я наступил на какие то грабли,
универсальная ссылка схлопывалась до простого референса.
сейчас это, наверное, уже не актуально.

Цитата Сообщение от ct0r Посмотреть сообщение
на кой фиг нужны вариадик конструкторы
что иметь возможность обработать аргументы любых типов.
область применения вариадиков - различные статические фабрики,
корежи, делегаты, и тп вещи.

Цитата Сообщение от ct0r Посмотреть сообщение
std::initializer_list<T>
не умеет разные типы.

Цитата Сообщение от mporro Посмотреть сообщение
это уже откровенный провал дизайна
одна из наиболее важных фич с++11, на мой взгляд.
её ценность соизмерима с ценностью decltype,
на мой взгляд,

Цитата Сообщение от ct0r Посмотреть сообщение
Ну тогда, если уж охота, то можно написать вариадик конструктор, принимающий несколько списков инициализации Не?
нет.

это будут разные списки из одинаковых типов.
однако на практике требуются списки из разных типов.

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

Цитата Сообщение от ct0r Посмотреть сообщение
Какие вообще use-cases?
std::make_shared и тп вещи, например.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Пока что сложно представить себе класс, который говорит "пихай в меня всё, что хочешь
потому что вы пытаетесь представить себе ситуацию "пихай что хочешь".
вместо этого представьте себе ситуацию:
"я не знаю ранее, что там может быть".

наприммер: диначический делегат.

имеет дизайн:

C++
1
2
// --- не шаблонный
connector con(obj, &some::method, 10,"ololo",true);
ему нужно уметь нацеливаться на любые функции,
методы, с учетом биндинга аргументов, и тп.

при этом изначально, заранее,
не известно на что именно его будут нацеливать.

я такую штуку делал ещё под с++03.
вариадиков мне люто не хватало.

пришлось применить тяжелую артилерию на макросах.


ну или вот, тоже из личной практики,
паттерн "домики":

C++
1
2
3
4
5
6
7
auto root = widget::create<Ваш собственный виджет>(аргументы вашего виджета)
    .width(800)
    .heigth(600)
    .add<Ещё один виджет>(и его аргументы)
        .Label("trololo")
    .done()
.done();
есть некоторая базовая форма,
от которой наследуются другие формы.
базовая форма отвечает за механику построения дерева.

кроме того, базовой форме в свою очередь
так же можно указать базовый класс.
так называемый "интерфейс форм".

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

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

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

вообще, при желании,
примеров можно привести массу.

Цитата Сообщение от Kastaneda Посмотреть сообщение
как вариант можно дергать делегирующие конструкторы, которые будут дергать другие делегирующие конструкторы
вообще в этой реализации так и получилось:
я выделил шаблоно-конструкторы с одним параметром,
который можно было проанализировать.
это - универсальное решение

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

и кстати, ребята спрашивали, зачем такое может понадобится.

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

есть некая хитрая смарт-обертка,
которая помимо прочего позволяет версионировать ресурс.
можно одновременно модифицировать,
и сохранять ресурс на диск, например.
это не важно.

суть в том, что она должна уметь
сконструировать захватываемый ресурс.

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

http://rextester.com/WNJIT27551

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
#include <type_traits>
#include <tuple>
#include <iostream>
#include <typeinfo>
 
 
template<class T, class... Args>
struct LastType
{
    typedef typename LastType<Args...>::Type
        Type;
};
 
template<class T> struct LastType<T>
    { typedef T Type; };
 
 
struct Alloc{};
    
#define dNOREF  \
    typename std::remove_reference<L>::type
 
#define dNOCONST \
    typename std::remove_cv< dNOREF >::type
 
#define dFOR_ALLOCATOR                             \
    class L = typename LastType<Args...>::Type,    \
        typename std::enable_if<                   \
            std::is_same< dNOCONST, Alloc>::value  \
        >::type* = nullptr
 
#define dFOR_NO_ALLOCATOR                          \
    class L = typename LastType<Args...>::Type,    \
        typename std::enable_if<                   \
            !std::is_same< dNOCONST, Alloc>::value \
        >::type* = nullptr
 
struct Example
{
    template<class T, class... Args, dFOR_ALLOCATOR>
    Example(T&&, Args&&... args)
    {
        std::cout << "WITH ALLOCATOR\n";
        enum { num = sizeof ...(Args) };
        const auto&& tuple_ = 
            std::forward_as_tuple(args...);
        SetAlloc( std::get<num - 1>(tuple_) );
    }
 
    template<class T, class... Args, dFOR_NO_ALLOCATOR>
    Example(T&&, Args&&... )
        { std::cout << "WITHOUT ALLOCATOR\n"; }
 
    Example()
        { std::cout << "WITHOUT ARGUMENTS\n"; }
 
    template<class T>
    void SetAlloc(T&& alloc)
    {
        std::cout << "set allocator: " 
            << typeid(alloc).name() 
            << std::endl;
    }
 
 
};
 
#undef dNOCONST
#undef dNOREF
 
#undef dFOR_NO_ALLOCATOR
#undef dFOR_ALLOCATOR
 
 
//----------------------------------------------
 
 
 
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Alloc alloc;
    
    Example ex1(10, alloc);
    
    Example ex2(10, 20);
}
этот способ - наглядный пример-иллюстрация того,
как можно в шапке шаблона
анализировать строение вариадик-пака.

правда цена за это - явно указанный дефолтный конструктор.
 
Текущее время: 04:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru