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

C++

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

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

05.08.2016, 23:13. Просмотров 278. Ответов 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 конструируется не в конструкторе обертки. Увы, изменять это слишком затратно, ввиду того, что обертка имеет свою иерархию наследования, все это в ней крутится вертится с виртуальными функциями, полиморфизмом и прочим.
Т.е. этот пакет параметров, которые мы должны передать в конструктор объекта надо еще где-нибудь сохранить, чтобы позже использовать. Таскать пакет по ф-циям тоже не выйдет, ибо верхний базовый класс обертки - библиотечный. Вскрывать и разбираться в библиотеке - еще дольше.

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

C++ recursion with variadic template
Variadic Templates C++
C++ Variadic templates fail
Variadic templates C++
C++ Variadic templates
C++ Result_of + variadic templates
Variadic Templates - как обращаться к аргументам variadic-функции? C++
C++ Variadic template
Variadic templates C++
Variadic templates локальные переменные C++
Шаблонное вычисление типов и Variadic Templates C++
C++ Variadic templates, якобы provided 0 argumnets

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
6008 / 2448 / 437
Регистрация: 15.11.2014
Сообщений: 5,423
Завершенные тесты: 1
05.08.2016, 23:44     Variadic templates, или variadic constructor в шаблоне, или прочие извращения #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);
}
usertemplar
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
06.08.2016, 00:40  [ТС]     Variadic templates, или variadic constructor в шаблоне, или прочие извращения #3
hoggy, Спасибо, за предоставленный код. Вы очень помогли, но увы, он решает только половину задачи.

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

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

Не по теме:

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

DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
06.08.2016, 01:24     Variadic templates, или variadic constructor в шаблоне, или прочие извращения #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от usertemplar Посмотреть сообщение
этот пакет параметров необходимо сохранить
std::tuple, думаю, тут поможет.
usertemplar
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 8
06.08.2016, 15:49  [ТС]     Variadic templates, или variadic constructor в шаблоне, или прочие извращения #5
Цитата Сообщение от DrOffset Посмотреть сообщение
std::tuple, думаю, тут поможет.
Благодарю. Нагуглил статейку, вроде действительно, то, что нужно. Оставлю линк здесь, мало ли, вдруг у кого-нибудь будет такая же задача. Линк на статью.
Yandex
Объявления
06.08.2016, 15:49     Variadic templates, или variadic constructor в шаблоне, или прочие извращения
Ответ Создать тему
Опции темы

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