Как извлечь типы, переданные в параметрах шаблона? - PullRequest
1 голос
/ 04 ноября 2019

В приведенном ниже коде я хочу заменить «что-то» на что-то, что позволит мне объявить тип «f» в качестве второго параметра, передаваемого в C (при передаче C в шаблон M), т. Е. Плавать здесь.

#include<iostream>
using namespace std;
template<class A, class B>
class C{
    public :
        A a;
        B b;
};
template<class D>
class M{
    public :
        decltype(D::<something>) f;  //!!!!!!!!!!!!!!!!
        void show(){cout<<f;}
};
int main(){
    M<C<int,float>> m;
    m.show();
}

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Вы можете сделать это с помощью хитрого купола.

template<typename> class M; // leave undefined
template<template<typename, typename> D, 
         typename One,
         typename Two>
 class M<D<One, Two>> { // a specialisation
     Two f;
 };

Теперь вы можете передать M класс, который имеет ровно два параметра шаблона (например, C<int, float>). Если вы передадите что-то еще (например, int), будет ошибка.

2 голосов
/ 04 ноября 2019

Как насчет шаблона, принимающего шаблон?

С помощью следующей строки вы можете объявить шаблон, принимающий шаблон, и назвать его типовые аргументы типов:

template<
template<typename, typename> class D, 
          typename A, typename B>

С помощью этой записиВы говорите, что D - это параметр шаблона, который сам по себе является шаблоном, а A и B - это типы, которые он принимает. Теперь вы можете обратиться к первому и второму параметру шаблона D с именами A и B.


using namespace std;
template<class A, class B>
class C{
    public :
        A a;
        B b;
};
template<template<typename, typename> class T, typename A, typename B>
class M{
    public :
        B f;  //!!!!!!!!!!!!!!!!
        void show(){cout<<f;}
};
int main(){
    M<C, int, float> m;
    m.show();
}

Для получения дополнительной информации проверьте этот ответ.

...