Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
usertemplar
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
#1

Variadic templates, или variadic constructor в шаблоне, или прочие извращения - C++

05.08.2016, 23:13. Просмотров 346. Ответов 4
Метки нет (Все метки)

Здравствуйте.

Есть такое
C++
1
Wrapper<Obj> w;
Wrapper - обертка над объектом того класса, который ему скормят (в данном случае - Obj). Сложная обертка со своей жизнью и делами. Одну из вещей, которая делает эта обертка - конструирует объект класса Obj.
Все было прекрасно, до той поры, пока все классы, которые скармливались этой обертке, имели конструктор по-умолчанию. Но возникла задача оборачивать классы, которые не имеют конструктора по-умолчанию, т.е., чтобы обертка конструировала объект, передавая в его конструктор некоторые данные.

То есть так
C++
1
Wrapper<Obj, o1, o2,...> w;
или так
C++
1
Wrapper<Obj> w(o1,o2,...);
Аргументов (o1, o2,...) может быть, разумеется, сколь угодно, хоть 1, хоть 10, шаблон же пишем.
И вот тут я пришел к вам за помощью. Ситуацию немного омрачает тот факт, что объект класса Obj конструируется не в конструкторе обертки. Увы, изменять это слишком затратно, ввиду того, что обертка имеет свою иерархию наследования, все это в ней крутится вертится с виртуальными функциями, полиморфизмом и прочим.
Т.е. этот пакет параметров, которые мы должны передать в конструктор объекта надо еще где-нибудь сохранить, чтобы позже использовать. Таскать пакет по ф-циям тоже не выйдет, ибо верхний базовый класс обертки - библиотечный. Вскрывать и разбираться в библиотеке - еще дольше.

В общем извините за стену текста, идей пока никаких, прошу помощи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2016, 23:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Variadic templates, или variadic constructor в шаблоне, или прочие извращения (C++):

[дизайн и эволюция] провалы в variadic конструкторы - C++
всем привет. уже несколько человек обращались ко мне по почте, с просьбой помочь разобраться с variadic конструкторами. я...

Перенаправление указателя при перегрузке оператора в variadic template - C++
Есть вот такой вот код (сделан в vs2014): #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; ...

Variadic Templates - как обращаться к аргументам variadic-функции? - C++
Всем привет! Наверное, рано мне ещё с моими скудными знаниями в это лезть, но, изучив шаблоны и вариадик-функции, я, естественно, горю...

Variadic templates - C++
1. как можно сделать чтобы передавались ссылки на переменные? (с variadic templates) 2. как вообще обращаться к переменным объявленным...

Variadic templates - C++
как можно сделать чтобы функция принимала бесконечное количество объектов std::string? (только их) я пробовал вот так: template&lt;const...

Variadic templates - C++
А как бы так исхитриться, чтобы шаблонная функция, использующая Variadic templates узнала размер передаваемых ей параметров с тем, чтобы,...

4
hoggy
6813 / 3001 / 516
Регистрация: 15.11.2014
Сообщений: 6,795
Завершенные тесты: 1
05.08.2016, 23:44 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от usertemplar Посмотреть сообщение
Аргументов (o1, o2,...) может быть, разумеется, сколь угодно, хоть 1, хоть 10, шаблон же пишем.
http://rextester.com/TBPT7423

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
#include <iostream>
 
template<class T> struct wrapper
{
    template<class ...Args>
    void emplace(Args&&... args)
    {
        T obj(  std::forward<Args>(args)... );
    }
        
};
 
 
struct sample
{
    sample(int i,bool b)
    {
        std::cout <<"ctor(" 
            << i << ", " << (b? "true":"false") 
        << ");\n"; 
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    wrapper<sample> w;
    
    w.emplace(10, true);
}
1
usertemplar
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
06.08.2016, 00:40  [ТС] #3
hoggy, Спасибо, за предоставленный код. Вы очень помогли, но увы, он решает только половину задачи.

Цитата Сообщение от usertemplar Посмотреть сообщение
Т.е. этот пакет параметров, которые мы должны передать в конструктор объекта надо еще где-нибудь сохранить, чтобы позже использовать. Таскать пакет по ф-циям тоже не выйдет, ибо верхний базовый класс обертки - библиотечный. Вскрывать и разбираться в библиотеке - еще дольше.
Объект конструируется в ф-ции, кот-ая вызывается в библиотечном классе (виртуальная). Сигнатура ф-ции должна остаться неизменной. Именно поэтому, если это возможно, этот пакет параметров необходимо сохранить. В голову приходит идея использовать какой-либо класс-коллекцию, который будет в себе хранить эти аргументы. Однако я немного не до конца знаю, что вообще можно делать с этим пакетом параметров и как это делать, а главное, как оптимальнее всего. Как его можно перебрать (range-based loop для него уместен?)? А как обратно потом его запаковать? Или как потом, собственно, сконструировать объект, передавая в него все эти аргументы.

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

Не по теме:

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

0
DrOffset
7517 / 4513 / 1024
Регистрация: 30.01.2014
Сообщений: 7,362
06.08.2016, 01:24 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от usertemplar Посмотреть сообщение
этот пакет параметров необходимо сохранить
std::tuple, думаю, тут поможет.
1
usertemplar
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
06.08.2016, 15:49  [ТС] #5
Цитата Сообщение от DrOffset Посмотреть сообщение
std::tuple, думаю, тут поможет.
Благодарю. Нагуглил статейку, вроде действительно, то, что нужно. Оставлю линк здесь, мало ли, вдруг у кого-нибудь будет такая же задача. Линк на статью.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2016, 15:49
Привет! Вот еще темы с ответами:

Variadic Templates - C++
проблема только в переводе на русский, обычно это &quot;Шаблоны с переменным числом аргументов&quot; но такое длинное выражение долго не проживёт....

Result_of + variadic templates - C++
Как здесь можно вывести возвращаемый тип функторов? res_t должен получиться типом которым они параметризуются.template &lt;typename ... F&gt; ...

Variadic templates fail - C++
Здравствуйте. У меня проблема, нужно реализовать в проекте функционал, который будет использовать шаблоны с переменным количеством...

Variadic templates локальные переменные - C++
Еще один вопрос по Variadic templates. Решаю следующую задачу: Необходимо сохранить в памяти функцию с набором параметров для...


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

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

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