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

时间:2018-05-07 14:48:34

标签: 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>{

};

等等。我还有一系列适用于这些类的方法。但是,问题出在返回类型中。我希望这个方法返回传入类的实例,整数递减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){

}

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

我想这看起来像

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

}

其中P以某种方式捕获原始类型ABC,以及内部类型T

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

2 个答案:

答案 0 :(得分:8)

听起来你需要使用template template parameter。这些模板参数本身就是类模板。在以下示例中,P是一个模板参数,它需要一个类模板,其中该类模板需要一个类型参数后跟一个size_t参数(例如类模板A,{{您提供的1}}或B

C

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

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

答案 1 :(得分:0)

我通常不会使用模板模板语法。 如果模板类型定义是递归的,我宁愿坚持旧学校的方式:

template<typename T, int I>
struct A{
    using Other=A<T,I-1>;
};
template<typename P>
typename P::Other f(P);