Как настроить параметры шаблона гнезда? - PullRequest
0 голосов
/ 20 января 2019

В настоящее время я работаю над проектом C ++ с шаблонными классами. Я делал это раньше, и я знаю, как работает шаблонизация для одноуровневых параметров шаблона. Но для классов в моем текущем проекте я использую следующее ( важное примечание: сильно упрощено для чтения)

template<typename T>
struct B{
    B(){}
    void bar();
};

template<int k>
struct A{
    A(){}
    void foo(); 
};

template class A<1>;
template class B< A<1> >;

, который компилируется и работает нормально, пока я не вызываю foo () или bar (). Теперь я знаю, как написать шаблон для void foo () для всех k, используя

template<int k>
void A<k>::foo(){
    printf("foo %d\n", k);
}

И я знаю, что могу поставить

template<>
void B<A<1> >::bar(){
    printf("A<1> bar\n");
}

, который будет реализовывать bar () для B >. Вот в чем дело: я хочу использовать несколько значений для k (k = 1 - только пример) без необходимости копировать вышеупомянутое для всех случаев. Вот почему я хочу написать шаблон для bar () также. Тем не менее,

template<int k>
void B<A<k> >::bar(){
    printf("Templated bar() for k=%d\n", k);
}

не работает. Каким должен быть точный оператор шаблона для шаблона bar () для любого B ? Классы A и B в этом случае были доставлены в библиотеку (заголовок), которую я не могу изменять, и с помощью foo () и bar () осталось реализовать.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Частичная специализация хороша (как уже упоминалось другими), но вы должны реализовать все члены из исходного класса B.Другой подход заключается в извлечении k из A с использованием внешнего инструмента (A_traits в этом примере).

template <typename>
struct A_traits;

template <int K>
struct A_traits<A<K>> : std::integral_constant<int, K> {};

Ваша реализация практически не изменилась, просто используйте A_traits для извлечения k.

template <typename T>
void B<T>::bar() {
  printf("Templated bar() for k=%d\n", A_traits<T>::value);
}
0 голосов
/ 20 января 2019

Вы можете частично специализировать B, например, так:

// this is unchanged
template<typename T>
struct B{
    B(){}
    void bar();
};

// but this is added by you
template <int k>
struct B<A<k>> {
    void bar();
};

, что позволит вам реализовать:

template <int k>
void B<A<k>>::bar() {
    printf("A<k> bar\n");
}

и запустить:

int main() {
    B<A<3>> b{};

    b.bar();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...