簡體   English   中英

函數返回類型,具有不同的模板參數

[英]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以某種方式捕獲原始類型ABC ,以及內部類型T

或者,如果您認為CRTP是可行的方式,那么我將如何構建它?

聽起來你需要使用模板模板參數 這些模板參數本身就是類模板。 在下面的示例中, P是一個模板參數,它需要一個類模板,其中該類模板需要一個類型參數,后跟一個size_t參數(例如您提供的類模板ABC ):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM