166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
1

Variadic template

09.11.2015, 15:22. Показов 458. Ответов 8
Метки нет (Все метки)

Добрый день, господа. Будьте добры, помогите кто может.

Есть у меня шаблонный класс
C++
1
2
3
4
template<typename ... Types>
Class : publuc Types ...{
...
}
Мне требуется организовать функцию частичного копирования данных из одного объекта типа Class<Types...> в другой. Частичное копирование заключается в том, что данные части типов используются, части нет.
Копирования пытаюсь осуществить с помощью функции вида
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename ... Types>
void copy(const Class<Types...>* const src,Class<Types...>* dst){
copy(reinterpret_cast<const Class<>* const>(src),reinterpret_cast<const Types* const>(src)...,reinterpret_cast<Class<>*>(dst),reinterpret_cast<Types*>(dst)...);
};
template<typename ... Types>
void copy(const Class<>* const src,const Types* const ... srcCasts, Class<>* dst,Types* ... dstCasts){
};
template<typename Type, typename ... Types>
void copy(const Class<>* const src,const Type* const srcCast,const Types* const ... otherSrcCasts, Class<>* dst,Type* const dstCast,Types* ... otherDstCasts){
copy(src,srcCast,            dst,dstCast);
copy(src,otherSrcCasts...,dst,otherDstCasts...);
};
template<typename Type>
void copy(const Class<>* const src,const Type* const srcCast,Class<>* dst,Type* dstCast){
};
template<>
void copy(const Class<>* const src,Class<>* dst){
};
При компиляции выдает, что функцию copy не принимает N аргументов, где N = sizeof ... (Types) + 2;

Что я делаю не так и как нужно?

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

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

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

С++ 11 Variadic template
не работает, как правильно? template&lt;typename T, typename... ArgTypes&gt; struct...

Не работает variadic template
привет. код #include &lt;typeinfo&gt; #include &lt;iostream&gt; #include &lt;deque&gt; using namespace std; ...

recursion with variadic template
#define NOT_COMPILE 1 #if NOT_COMPILE // так не компилится template &lt;class Type, unsigned...

Variadic template lambda capture
Доброго всем дня! Речь пойдёт об C++14, в котором стало возможным делать прямую передачу в...

8
Эксперт по математике/физикеЭксперт С++
1932 / 1270 / 365
Регистрация: 16.05.2013
Сообщений: 3,317
Записей в блоге: 6
09.11.2015, 15:59 2
Может вы просто запутались со специализациями ибо не совсем понятно для чего вам столько перегруженных функций.
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
template<typename ... Types>
class Class : public Types...{
 
};
 
template<typename ... Types>
void copy(const Class<Types...>* const src,Class<Types...>* dst){
    copy(reinterpret_cast<const Class<>* const>(src),reinterpret_cast<const Types* const>(src)...,reinterpret_cast<Class<>*>(dst),reinterpret_cast<Types*>(dst)...);
};
 
template<typename ... Types>
void copy_b(const Class<>* const src,const Types* const ... srcCasts, Class<>* dst,Types* ... dstCasts){
};
 
template<typename Type, typename ... Types>
void copy(const Class<>* const src,const Type* const srcCast,const Types* const ... otherSrcCasts, Class<>* dst,Type* const dstCast,Types* ... otherDstCasts){
    copy(src,srcCast,            dst,dstCast);
    copy_b(src,otherSrcCasts...,dst,otherDstCasts...);
};
template<typename Type>
void copy_b(const Class<>* const src,const Type* const srcCast,Class<>* dst,Type* dstCast){
};
 
template<>
void copy(const Class<>* const src,Class<>* dst){
};
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.11.2015, 16:13 3
Судя по наличию reinterpret_cast тут уже что-то не чисто.
Цитата Сообщение от Aneron Посмотреть сообщение
Мне требуется организовать функцию частичного копирования данных из одного объекта типа Class<Types...> в другой.
Можешь привести пример такого копирования?
0
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
09.11.2015, 16:21 4
Tulosba, я так понял, что из одного объекта Class, ТС'y нужно скопировать только часть подобъектов базовых классов в другой объект Class, а остальные подобъекты в целевом объекте должны остаться в состоянии default-initialized.
Ну а там посмотрим, что скажет Aneron

Цитата Сообщение от Tulosba Посмотреть сообщение
Судя по наличию reinterpret_cast тут уже что-то не чисто.
Воистину, смешивать Сишный подход с variadic template это нечто фантастическое и не поддающееся человеческому парсингу
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
09.11.2015, 16:44  [ТС] 5
Ilot, возможно. Но я тоже пытался разные имена дать, но не помогло.

По моей логике
Строчка 2 - непосредственно вызываемая функция. Ее задача преобразовать входные параметры и передать дальше в функцию, которая уже будет раскрывать пакет параметров.
Строка 6 - объявляю шаблонную функцию с другой сигнатурой. Мне для копирования нужно получить указатели на объекты Class<> и указатели на объект типа Type из Types.
Строка 9 - частично специализированная функция из строки 6. Собственно, раскрывает пакет параметров.
Строка 10 - функция копирования типа T.

Tulosba,попробую.
У меня есть некое дерево. Class<Types...> - это звено данного дерева, содержащее в себе данные. Данные могут быть нескольких типов. При определенном условии, мне требуется сделать побочное звено и прикрепить его к одному из звеньев этого дерева. После прикрепления требуется скопировать нужные данные, при этом учитывая положения звена на дереве.
В общем, лютая наркомания....

Добавлено через 11 минут
Цитата Сообщение от gromo Посмотреть сообщение
одного объекта Class, ТС'y нужно скопировать только часть подобъектов базовых классов в другой объект Class, а остальные подобъекты в целевом объекте должны остаться в состоянии default-initialized
таки да
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.11.2015, 17:25 6
Цитата Сообщение от Aneron Посмотреть сообщение
В общем, лютая наркомания....
Похоже на то. Но я хотел более очевидных примеров. Типа:
C++
1
2
3
4
5
6
7
struct S { // исходный тип
   int a;
   double b;
};
struct D { // целевой тип
   double c;
};
Копирование из S в D подрузумевает перенос значения члена b в c. Вот как-то так.
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
09.11.2015, 17:38  [ТС] 7
Tulosba, ааа... Хорошо)

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
class S1{
public:
int mS1 = 0;
};
 
class S2{
int mS2 = 1;
};
 
template<typename ... Types>
public S3 : public Types ...
{
public:
 int mS3 = 2;
};
 
template<typename ... Types>
void copy(const S3<Types...>* const mSrc, S3<Types...>* mDst)
{
 copy(mSrc, dynamic_cast<const Types* const>(mSrc)..., mDst, dynamic_cast<Types*>(mDst)...); 
};
 
template<typename ... Types>
void copy(const S3<>* const mSrc,const Types* const ... mSrcCasts, S3<>* mDst, Types* ... mDstCasts){};
 
template<typename  Type, typename ... Types>
void copy(const S3<>* const mSrc,const Type* const mSrcCast, const Types* const ... mSrcCasts, S3<>* mDst,Type* mDstCast, Types* ... mDstCasts){
 copy(mSrc,mSrcCast      , mDst, mDstCast);
 copy(mSrc,mSrcCasts ... , mDst, mDstCasts ...);
};
 
template<typename  Type>
void copy(const S3<>* const mSrc,const Type* const mSrcCast, S3<>* mDst,Type* mDstCast){};
 
template<>
void copy<S2>(const S3<>* const mSrc,const S2* const mSrcCast, S3<>* mDst,S2* mDstCast){
 *mSrcCast = *mDstCast;
};
 
int main()
{
 S3<S1,S2> mSrc;
 mSrc.mS1 = 100;
 
 S3<S1,S2> mDst;
 
 copy(&mSrc,&mDst); 
}
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.11.2015, 17:52 8
Aneron, так у тебя типы одинаковые у mSrc и mDst. Зачем тут что-то городить? Подойдет обычное почленное копирование.
Или я не так понял?
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
09.11.2015, 18:33  [ТС] 9
Tulosba, да, типы у обоих объектов полностью одинаковы.
По идее, mSrc может быть как типа S3<S1,S2>, так и другого типа, например, S3<S1>,S3<S1,S2,S4> и т.д..
Если выполнять почленное копирование, то придется кастить mSrc к каждому типу, который хотим скопировать, проверять валидность полученного значения и при возможности - копировать. Или я не прав?
Если прав, то получается много лишнего кода,имхо.

Мой же колхоз,по идее,позволяет обойти этого. Если у функции копирования есть специализация для данного типа, то данные будут скопированы, если нет, то нет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2015, 18:33

Класс сигнала на Variadic Template
Добрый день! Написал класс &quot;сигнала&quot; при помощи variadic templates, но он почему-то не работает:...

Как правильно перебросить аргументы в variadic template?
всем привет, можете помочь пж, есть такая ф-ция: template&lt;typename ... Args&gt; inline wstring...

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

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...


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

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

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