"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
1

Мета функция PushFront

14.04.2021, 18:47. Показов 3098. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// PushFront
 
template <typename ... Elements>
struct TypeList {};
 
// Первичный шаблон
template < typename List, typename NewElement > // Если удалить "typename NewElement" то ошибка.
struct PushFrontT;
 
// Метафункция PushFront
template < typename ... List, typename NewElement >
struct PushFrontT < TypeList < List ... >, NewElement >
{
    using Type = TypeList < NewElement, List ... >;
};
 
template < typename List, typename NewElement >
using PushFront = typename PushFrontT< List, NewElement >::Type;
Почему важно, что бы количество параметров первичного шаблона совпадало с количеством аргументов в специализации
в метафункции PushFront? Как работает данный механизм?

Добавлено через 26 минут
Как я понял, тут действуют особые правила частичной специализации, а они как бы описывают отношения между параметрами шаблона. Но все равно интересно как это все работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2021, 18:47
Ответы с готовыми решениями:

МЕТА
на одном сайте коллеги - конкурента заметил следующее &lt;META NAME=&quot;robots&quot; CONTENT=&quot;index,all&quot;&gt;...

мета-описания
Нужно ли делать для Google уникальные мета-описания. Просто раньше для этого использовал кусок из...

Динамические Мета
Всем прив! Есть автомоб. журнал. Дескриптшен и Кейворды генереится автоматически, т.е.: -...

Мета теги
Подскажите как правильно прописать мета теги.Куда вставить ключевые слова.И саму форму тегов. Если...

6
16085 / 8686 / 2121
Регистрация: 30.01.2014
Сообщений: 14,972
14.04.2021, 18:58 2
_stanislav,
Речь про эти аргументы?
Код
template < typename ... List, typename NewElement >
Если да, то ничего оно не "должно". Они тут потому что они нужны по замыслу. Нам в специализации важен и первый и второй аргументы. На их основе же создается TypeList. Но если предположить, что, допустим, второй аргумент не нужен, то никто не запретит сделать, например, так:
C++
1
2
3
4
5
6
// Метафункция PushFront
template < typename ... List>
struct PushFrontT < TypeList < List ... >, void >
{
    using Type = TypeList < void, List ... >;
};
Добавлено через 5 минут
Цитата Сообщение от _stanislav Посмотреть сообщение
Но все равно интересно как это все работает.
Не очень понятен вопрос в такой постановке, то видимо ответ здесь https://en.cppreference.com/w/... ialization ?
When a class or variable (since C++14) template is instantiated, and there are partial specializations available, the compiler has to decide if the primary template is going to be used or one of its partial specializations.
1) If only one specialization matches the template arguments, that specialization is used
2) If more than one specialization matches, partial order rules are used to determine which specialization is more specialized. The most specialized specialization is used, if it is unique (if it is not unique, the program cannot be compiled)
3) If no specializations match, the primary template is used
C++
1
2
3
4
5
6
7
8
// given the template A as defined above
A<int, int, 1> a1;   // no specializations match, uses primary template
A<int, int*, 1> a2;  // uses partial specialization #1 (T=int, I=1)
A<int, char*, 5> a3; // uses partial specialization #3, (T=char)
A<int, char*, 1> a4; // uses partial specialization #4, (X=int, T=char, I=1)
A<int*, int*, 2> a5; // error: matches #2 (T=int, T2=int*, I=2)
                     //        matches #4 (X=int*, T=int, I=2)
                     // neither one is more specialized than the other
Informally "A is more specialized than B" means "A accepts a subset of the types that B accepts".

Formally, to establish more-specialized-than relationship between partial specializations, each is first converted to a fictitious function template as follows:
  • the first function template has the same template parameters as the first partial specialization and has just one function parameter, whose type is a class template specialization with all the template arguments from the first partial specialization
  • the second function template has the same template parameters as the second partial specialization and has just one function parameter whose type is a class template specialization with all the template arguments from the second partial specialization.

The function templates are then ranked as if for function template overloading.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<int I, int J, class T> struct X { }; // primary template
template<int I, int J>          struct X<I, J, int> {
        static const int s = 1;
}; // partial specialization #1
// fictitious function template for #1 is
// template<int I, int J> void f(X<I, J, int>); #A
 
template<int I>                 struct X<I, I, int> {
        static const int s = 2;
}; // partial specialization #2
// fictitious function template for #2 is 
// template<int I>        void f(X<I, I, int>); #B
 
int main()
{
    X<2, 2, int> x; // both #1 and #2 match
// partial ordering for function templates:
// #A from #B: void(X<I,J,int>) from void(X<U1, U1, int>): deduction ok
// #B from #A: void(X<I,I,int>) from void(X<U1, U2, int>): deduction fails
// #B is more specialized
// #2 is the specialization that is instantiated
    std::cout << x.s << '\n'; // prints 2
}
1
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
14.04.2021, 19:04  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Речь про эти аргументы?
это параметры

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Не очень понятен вопрос в такой постановке, то видимо ответ здесь https://en.cppreference.com/w/... ialization ?
видимо да, нужно читатнуть

Добавлено через 5 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Если да, то ничего оно не "должно". Они тут потому что они нужны по замыслу. Нам в специализации важен и первый и второй аргументы. На их основе же создается TypeList.
если:
Нам в специализации важен и первый и второй аргументы.
Для чего они нам нужны в первичном шаблоне, или лучше наверное спросить, для чего нам вообще нужен первичный шаблон, если у него даже определения нет, наверное в этом разгадка?
0
16085 / 8686 / 2121
Регистрация: 30.01.2014
Сообщений: 14,972
14.04.2021, 19:16 4
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Цитата Сообщение от _stanislav Посмотреть сообщение
для чего нам вообще нужен первичный шаблон
Для того, чтобы задать что именно специализировать. Далее термин некорректный, но, мне кажется, понятный - чтобы задать "сигнатуру" того, что именно будет специализироваться.

А специализация именно в таком виде нужна, чтобы отсечь все неподходящие варианты, т.е. первым параметром нам нужен именно TypeList. Она разрешает именно такое использование шаблона, а отсутствие реализации у основного шаблона запрещает все остальные варианты использования.
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
14.04.2021, 23:19 5
Цитата Сообщение от _stanislav Посмотреть сообщение
Почему важно, что бы количество параметров первичного шаблона совпадало с количеством аргументов в специализации в метафункции PushFront?
В первичном шаблоне нельзя удалить typename NewElement, потому что, например, есть требование что частичная специализация должна быть более специализирована чем первичный шаблон. Что определяется через то, какая из синтезированных функций:
C++
1
2
3
4
5
template<typename List, typename NewElement>
void f(PushFrontT<List, NewElement>); // primary
 
template < typename ... List, typename NewElement >
void f( PushFrontT < TypeList < List ... >, NewElement >); // partial
является более специализированной. Если бы синтезированная функция для первичного шаблона выглядела как
C++
1
2
template<typename List>
void f(PushFrontT<List>); // primary
, то функция для частичной специализации не могла бы быть более специализированной чем для первичной.
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
17.04.2021, 01:24 6
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Цитата Сообщение от _stanislav Посмотреть сообщение
Почему важно, что бы количество параметров первичного шаблона совпадало с количеством аргументов в специализации в метафункции PushFront?
Умные люди подсказали тут, что есть более явное правило:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/temp.class.spec.match#3
If the template arguments of a partial specialization cannot be deduced because of the structure of its template-parameter-list and the template-id, the program is ill-formed.
Согласно следующему после процитированного параграфу, при именовании специализации шаблона класса, аргументы должны быть совместимыми с параметрами первичного шаблона. Вместе эти параграфы означают что аргументы специализации должны быть выводимы хотя бы для каких-то аргументов для первичного шаблона. Так что если первичный шаблон имеет один параметр, который не pack, то частичная специализация не может иметь двух аргументов.
1
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
17.04.2021, 12:40  [ТС] 7
Цитата Сообщение от argcargv Посмотреть сообщение
Умные люди подсказали тут
Привет передай...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2021, 12:40
Помогаю со студенческими работами здесь

Мета теги в бд
Всем привет. Перенесли сайт с опенкартана другую цмс и забрали доменное имя. Старый сайт теперь...

Мета теги
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot; /&gt; &lt;meta...

о мета-тегах
&lt;meta name=&quot;robots&quot; content=&quot;index,follow&quot;&gt; нужно ли это? что это дает? заранее благодарен :)

МЕТА тэги
ТИТАНЫ SEO, подскажите плиз :D , при заполнение мета тэгов например: keywords , как будет правильно...

Мета теги
ко мне jobhunter иногда присылает вакансии по моему резюме, но они все для имеющих статус работы в...

мета теги
если стоят теги meta http-equiv keywords и description а meta name не стоят будет ли работать это...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru