簡體   English   中英

使用派生的模板參數類型作為函數的返回類型(CRTP)?

[英]Use the template parameter type of derived as return type for function (CRTP)?

我已經重新創建了以下代碼中的問題:

template<typename T>
class A{
    using type = T::type;
    type someFunction(/*some parameters*/){/*code for the function*/}
    //other stuff
};

template<typename T>
class B : public A<B<T>>{
    typedef T type;
    //other stuff
};

問題是我需要讓A具有返回類型為T::type的函數,但是由於在A編譯時B並未完全聲明B,所以我會收到錯誤消息,錯誤地invalid use of incomplete type 'class B<int>'當我嘗試對其進行編譯時(可以將int替換為任何其他類型)。 有什么辦法可以使它正常工作嗎?

如果將B<T>::type的定義移至外部特征類,則可以實現:

template <typename T>
struct Traits { /* maybe some default values */ };

template<typename T>
class A{
    using type = typename Traits<T>::type;
    type someFunction(/*some parameters*/){/*code for the function*/}
    //other stuff
};

template<typename T>
class B : public A<B<T>>{
    using type = typename Traits<B<T>>::type;
};

template <typename T>
struct Traits<B<T>> {
    using type = T;
};

有什么辦法可以使它正常工作嗎?

您可以使用traits類來派生類型,而不是使用:

using type = T::type;

例:

// Declare TypeSelector
template <typename T> struct TypeSelector;

template <typename T>
class A
{
    using type = typename TypeSelector<T>::type;
    type someFunction(/*some parameters*/){ return type {}; }
};

// Declare B.
template <typename T> class B;

// Define TypeSelector for <B<T>> first before defining B<T>
template <typename T> struct TypeSelector<B<T>>
{
    using type = T;
};

template<typename T>
class B : public A<B<T>>{
    using type = typename TypeSelector<T>::type;
    //other stuff
};

int main()
{
   // Compiles fine.
   B<int> a;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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