Тип возврата функции с другим параметром шаблона - PullRequest
0 голосов
/ 07 мая 2018

У меня есть несколько классов C ++, которые имеют одинаковые параметры шаблона

template <typename T, size_t i>
struct A {

};

template <typename T, size_t i>
struct B : A<T,i>{

};

template <typename T, size_t i>
struct C : A<T,i>{

};

и так далее. У меня также есть ряд методов, которые будут работать на любом из этих классов. Однако проблема заключается в типе возвращаемого значения. Я хотел бы, чтобы этот метод возвращал экземпляр переданного в классе, с целым числом, уменьшенным на единицу. Например, если я просто перегружу функцию, это выглядело бы так:

template <typename T, size_t i>
A<T,i-1> func(const A<T,i> & a){

}

template <typename T, size_t i>
B<T,i-1> func(const B<T,i> & a){

}

template <typename T, size_t i>
C<T,i-1> func(const C<T,i> & a){

}

Есть ли способ сделать это, не перегружая функцию для каждого типа? Под этим я подразумеваю ... возможно ли заменить их одной шаблонной функцией? Логика одинакова для всех функций.

Я думаю, что это будет выглядеть примерно так:

template <typename P, size_t i>
P<i-1> func( const P<i> & p ){

}

, где P каким-то образом захватывает исходный тип A, B или C, а также внутренний тип T.

Или, если вы думаете, что CRTP - это путь, то как бы я это структурировал?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я обычно не использую синтаксис шаблона шаблона. В случае, если определения типов шаблонов являются рекурсивными, я бы предпочел придерживаться старой школы:

template<typename T, int I>
struct A{
    using Other=A<T,I-1>;
};
template<typename P>
typename P::Other f(P);
0 голосов
/ 07 мая 2018

Похоже, вам нужно использовать шаблон шаблона параметра . Эти параметры шаблона сами являются шаблонами классов. В следующем примере P - это параметр шаблона, который ожидает шаблон класса, где этот шаблон класса ожидает аргумент типа, за которым следует аргумент size_t (например, шаблоны классов A, B или C, которые вы при условии):

template<template<class, size_t> class P, class T, size_t i>
P<T, i - 1> my_func(const P<T, i> & my_P);

int main()
{
    A<int, 10> a;
    B<char, 3> b;
    C<double, 7> c;

    auto smaller_a = my_func(a); // is a A<int, 9>
    auto smaller_b = my_func(b); // is a B<char, 2>
    auto smaller_c = my_func(c); // is a C<double, 6>
}

Поскольку вы не объяснили, что на самом деле должна делать ваша функция, я просто предоставил объявление функции и пропустил определение.

Демонстрация компиляции C ++ 11: https://godbolt.org/g/zpXVEb

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