函数返回类型,具有不同的模板参数

bre*_*att 5 c++ c++11

我有一些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>{

};
Run Code Online (Sandbox Code Playgroud)

等等.我还有一系列适用于这些类的方法.但是,问题出在返回类型中.我希望这个方法返回传入类的实例,整数递减1.例如,如果我只是重载函数,那将是这样的

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){

}
Run Code Online (Sandbox Code Playgroud)

有没有办法在不重载每种类型的函数的情况下完成此操作?我的意思是......是否可以用单个模板化函数替换它们?所有功能的逻辑都是相同的.

我想这会是这样的

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

}
Run Code Online (Sandbox Code Playgroud)

其中P以某种方式捕获的原始类型A,BC,以及所述内型T.

或者,如果您认为CRTP是可行的方式,那么我将如何构建它?

Fra*_*eux 8

听起来你需要使用模板模板参数.这些模板参数本身就是类模板.在下面的示例中,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>
}
Run Code Online (Sandbox Code Playgroud)

既然你没有解释你的函数应该实际做什么,我刚刚提供了函数声明并省略了定义.

C++ 11编译演示:https://godbolt.org/g/zpXVEb