[英]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.