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

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

05.08.2016, 23:13. Показов 1276. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2016, 23:13
Ответы с готовыми решениями:

ISO C++ does not include variadic templates
Добрый день. Не могу понять в чем дело: это я косячу и опять не замечаю &quot;мелочи&quot; или... При ...

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

Variadic templates
typedef function&lt;double(double ...)&gt; fun; inline int sum() { return 0; } template...

Variadic templates
Как обращаться напрямую к элементам Args? template&lt;typename... Args&gt;

4
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,202
05.08.2016, 23:44 2
Лучший ответ Сообщение было отмечено usertemplar как решение

Решение

Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
06.08.2016, 00:40  [ТС] 3
hoggy, Спасибо, за предоставленный код. Вы очень помогли, но увы, он решает только половину задачи.

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

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

Не по теме:

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

0
15106 / 8107 / 1957
Регистрация: 30.01.2014
Сообщений: 13,773
06.08.2016, 01:24 4
Лучший ответ Сообщение было отмечено usertemplar как решение

Решение

Цитата Сообщение от usertemplar Посмотреть сообщение
этот пакет параметров необходимо сохранить
std::tuple, думаю, тут поможет.
1
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
06.08.2016, 15:49  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
std::tuple, думаю, тут поможет.
Благодарю. Нагуглил статейку, вроде действительно, то, что нужно. Оставлю линк здесь, мало ли, вдруг у кого-нибудь будет такая же задача. Линк на статью.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2016, 15:49

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

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

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

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


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

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

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