2014-02-25 40 views
2

我有兩個類結構如下:重載操作符 - >當符*返回臨時

struct A { 
    A transform() const; 
}; 

struct B { 
    // returns a temporary A 
    A operator*() const; 
}; 

*操作可能看起來有點怪異這裏,但考慮到其使用的範圍實際上是很自然的。實際上,B真的只存在於爲嵌入式語言提供一些合成糖,所以它的方法和操作符被設計爲給出期望的代碼外觀。鑑於B b,得到了相關A快,*b。我有時想立即致電A的變換。目前,這需要一些額外的括號(*b).transform()。似乎有一種自然簡化,即b->transform()。但operator ->應該返回一個指針,operator *是返回一個臨時的。我怎樣才能實現這樣的過載?

+1

這是一個黑客,但你可以添加一個'A *運營商 - >(){返回此; ''到'A'。這是一個糟糕的黑客攻擊,但是你的'operator *'已經具有不同於內建運算符的語義,因爲它返回一個prvalue(不是左值)。 – dyp

+0

@dyp然後我可以寫這樣的東西:'* b-> transform()'?這並不是太糟糕,只是在這種情況下,'A'是一個在許多項目中共享的庫中使用的類,我寧願不對它做些奇怪的事情。 「B」可能會很不直觀。 –

+2

不,你會寫'B->變換()',[現場觀看(http://coliru.stacked-crooked.com/a/87bb2ef2ab2ca1a1)。你也可以從'B :: operator->'返回一箇中間類型,它具有這個成員'A * operator - >(){return/* something * /; }',其中'something'是一個數據成員。 – dyp

回答

3

免責聲明:我不負責更改從其內置的同行重載運營商的價值類別出現的任何混亂。

struct just_some_type 
{ 
    int m; 

    int transform() { return m; } 
}; 

// the intermediate helper stops the recurring application of -> 
// if the lhs of -> is of a class type 
struct intermediate_helper 
{ 
    just_some_type member; 

    just_some_type* operator->() { return &member; } 
}; 

struct ptr_like 
{ 
    just_some_type operator*() 
    { return {42}; } 

    intermediate_helper operator->() 
    { return {{42}}; } 
}; 

用例:

#include <iostream> 

int main() 
{ 
    auto p = ptr_like{}; 
    std::cout << (*p).transform() << "\n"; 
    std::cout << p->transform() << "\n"; 
} 

重要提示:對象在p->採取行動是一個左值,因爲內置->應用於指針!例如。你是否有資格與transformint transform() &;左值-REF,那麼版本(*p).transform()將無法​​編譯,但仍然p->transform()是合法的。

+0

顯然,如果合適的話,您可能需要添加const重載。 – dyp