[英]function return type with a different template parameter
我有一些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
以某种方式捕获原始类型A
, B
或C
,以及内部类型T
或者,如果您认为CRTP是可行的方式,那么我将如何构建它?
听起来你需要使用模板模板参数 。 这些模板参数本身就是类模板。 在下面的示例中, 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
我通常不使用模板模板语法。 如果模板类型定义是递归的,我宁愿坚持旧的学校方式:
template<typename T, int I>
struct A{
using Other=A<T,I-1>;
};
template<typename P>
typename P::Other f(P);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.