簡體   English   中英

實現返回 *this(協變返回類型)的“虛擬”方法

[英]Implementing a "virtual" method returning *this (covariant return type)

我正在編寫 C++ 類的層次結構,假設AB繼承AC繼承AD繼承B

現在,所有這些類都必須有一個方法bar() & ,其主體是:

{
    A::foo();
    return *this;
}

這是完全相同的代碼,做完全相同的事情——除了返回值的類型——它返回一個對類類型的左值引用。

現在,此方法的簽名對於每個 class 都是不同的。但是 - 它本質上是相同的方法。 事情是這樣的,我需要多次復制代碼。 我怎樣才能避免這種代碼重復?

我正在考慮用 CRTP 編寫一些 mixin,但是當我深入細節時,它變得非常丑陋。

注意:出於本示例的目的, bar()僅為左值定義,以免涉及從右值返回*this的合法性問題。

正如 Raymond Chen 評論的那樣,c++23 會推導出這樣的代碼:

struct A
{
    template <typename Self>
    Self& bar(this Self& self) // Here self is the static type which calls bar
                               // so potentially the derived type
    {
        self.A::foo(); // or self.foo();
        return self;
    }
    // ...
};
struct B : A{};
struct C : A{};
struct D : B{};

但目前,CRTP 可能會有所幫助,例如:

struct A
{
    // ...
};


template <typename Derived, typename Base>
struct A_CRTP : Base
{
    Derived& bar()
    {
        A::foo();
        return static_cast<Derived&>(*this);
    }
    // ...
};
struct B : A_CRTP<B, A> {};
struct C : A_CRTP<C, A> {};
struct D : A_CRTP<D, B> {};

暫無
暫無

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

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