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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ MPI задача коммивояжера методом ветвей и границ http://www.cyberforum.ru/cpp/thread1637290.html
помогите реализацией задача коммивояжера методом ветвей и границ на вычислительном кластере. может у кого то готовая программа есть или пример
C++ Нужна программа Логическая игра "Маджонг" может кто делал Игра Маджонг, В ходе игры необходимо очистить игровое поле, убирая одинаковые фишки. удаляться они могут только в том случае, если у фишки открыта хотя бы одна сторона. Сложность игры зависит от раскладки...чем больше открытых фишек, тем проще их убирать с поля.. игра может длиться долгое время. Нужна программа на С++ не важно Visual, Builder ,... итд http://www.cyberforum.ru/cpp/thread1637074.html
C++ Скомпилировать OpenPegasus под Win32. C/C++
Помогите скомпилировать OpenPegasus под Win32. C/C++ Есть проект OpenPegasus под Unix. Нужно его скомпилировать под Windows. Цель - поднять WMI/Wbem service provider на Win32. Исходники https://collaboration.opengroup.org/pegasus/documents.php?action=show&dcat=&gdid=32572
Снимок с веб-камеры C++
нашел такой пример, который выводит на окно видео в режиме онлайн с вэб камеры http://pastebin.com/c9LCaLRT (из за ограничения количества символов в сообщении пришлось залить код на пастебин) мне надо просто сохранять снимок, я попробовал сделать тоже самое в консоли получилось примерно так: #include <windows.h> #include <vfw.h> //Remember to Link to vfw32 Library, gdi32 Library
C++ При расшифровке RSA-сообщений на клиенте происходит ошибка http://www.cyberforum.ru/cpp/thread1634821.html
разрабатываю приложение на основе протокола подбрасывания честной монеты с использованием открытых и закрытых ключей, конкретно - ключей RSA. Сгенерила две пары ключей RSA, как и требуется, с одинаковым модулем n (в структуре openssl rsa - rsa->n). необходимо зашифровать данные первым открытым ключом на стороне, скажем, сервера, отослать другой стороне - клиенту. клиент, собственно, должен...
C++ Написать программу для наххождения НОД, НОК Разработка Windows-приложения (в Qt) определения наибольшего общего делителя, наименьшего общего кратного и простых чисел для заданных больших чисел. Именно чтобы можно было вводить большие числа, (например 438589746982457940984789237589723905839057895425). И если пролучится, то вести работу не с 2умя числами, а с массивом. С ценой вопроса по почте kartofaan@gmail.com подробнее

Показать сообщение отдельно
hoggy
6427 / 2645 / 458
Регистрация: 15.11.2014
Сообщений: 5,834
Завершенные тесты: 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);
}
этот способ - наглядный пример-иллюстрация того,
как можно в шапке шаблона
анализировать строение вариадик-пака.

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