У меня есть несколько классов 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 - это путь, то как бы я это структурировал?