2010-08-30 70 views
0

重載我想超載< <運營商鏈接像下面操作與鏈接

function1(param1, param2)<< obj2 << obj3 << string4 

功能1將返回一個對象。

我想要做的是在string4之後,我需要使用param1,param2調用一個函數。

我的問題將是

  1. 我怎麼知道是串,在表達式中的最後一個參數,因此我需要使用參數1和參數來調用另一個函數2或者它是不可能這樣做呢?

  2. 如何將param1和param2傳遞給要調用的函數?我無法將param1和param2存儲在對象中,因爲它是多線程的。

謝謝。

+0

你說的意思是「無法存儲'param1'和'param2'」傳遞函子?如果在'function1'對象和各種'operator <<'調用的構造之間不能保留這些對象,那麼在將來的函數調用中如何使用它們呢? – 2010-08-30 08:50:56

+0

請注意,由於函數參數的評估順序未指定,因此可以在obj2和obj3之前評估string4。那真的是你想要的嗎? – Chubsdad 2010-08-30 10:24:20

+0

@chubsdad:可以先評估string4,但這並不意味着它首先被髮送到流中。這裏的語義與iostreams相同。 – Potatoswatter 2010-08-30 10:29:59

回答

1

您可以通過在其析構函數中調用function2的值從function1返回一個幫助對象。

考慮這個例子:

#include <iostream> 

using namespace std; 

void function2(int i, int j) { 
    cout << "function2 called with " << i << " and " << j << endl; 
} 

struct Function2Caller { 
    Function2Caller(int param1, int param2) : m_param1(param1), m_param2(param2) {} 
    ~Function2Caller() { function2(m_param1, m_param2); } 

    int m_param1, m_param2; 
}; 

Function2Caller &operator<<(Function2Caller &obj, int x) { 
    cout << "Streaming " << x << endl; 
    return obj; 
} 

Function2Caller function1(int i, int j) { 
    cout << "function1 called with " << i << " and " << j << endl; 
    return Function2Caller(i, j); 
} 

int main() { 
    function1(2, 3) << 4 << 6; 
} 

這個程序打印

 
function1 called with 2 and 3 
Streaming 4 
Streaming 6 
function2 called with 2 and 3 

的想法是,在你行的末尾,在Function2Caller對象超出範圍,然後析構函數不工作。

請注意,執行此操作時,您應該禁止複製Function2Caller對象,並且使function1成爲唯一可以調用Function2Caller構造函數的人。

+0

感謝您的答覆。對於生成的臨時對象,何時正好在表達式中被破壞? – Steveng 2010-08-31 08:59:51

+0

此外,使用臨時對象,我可以創建像Function2Caller&operator <<(Function2Caller&,obj2)這樣的重載操作符嗎?這是因爲當我這樣做時,編譯器指出找不到重載操作符的錯誤。 – Steveng 2010-08-31 10:02:39

+0

@Steveng:臨時對象在語句結束時被銷燬。在'function1(1,3)<< x << y;'中可以在';'處正確。另外,是的,您可以在該對象上實現'operator <<'。運算符<<可以是一個成員函數(如我的例子)或一個自由函數。我用工作示例代碼更新了我的答案。 – 2010-09-01 08:56:20

0

我怎麼知道是串,在表達式中最後 參數,因此 我需要調用使用 參數1和參數的功能,或者是不可能 這樣做呢?

function1(param1, param2)<< obj2 << obj3 << string4 

沒有做什麼,你認爲它。這裏function1首先計算,生成的對象用來調用operator<<obj2作爲參數等等...

如果你想在最後調用function1,你叫operator<<string4作爲後應該發生一個論點。

如何將param1和param2傳遞給要調用的函數 ?我不能 將參數1和參數2存儲在 對象中,因爲它是多線程的。

op<<應該回到它具有op()定義類型T的對象,這樣你都可以將其與param1param2在最後。

+0

對不起對於造成的混亂,我需要調用的函數是另一個函數,function2 .. – Steveng 2010-08-30 08:51:07

0

如果function1返回一些東西(比如int),那麼您應該能夠延遲al計算直到它被使用。 。您應該返回一個可以轉換爲int的對象(通過將int operator int()作爲成員函數實現)。

在你構建它的function1的實現中。該對象還將執行<<。在執行轉換的成員函數中,使用您收集的所有值作爲參數,並使用<<運算符傳入。

+0

我不知道你是否需要這種行爲。如果你熟悉閱讀C++,這有點違反直覺。 – 2010-08-30 08:59:34

+0

我想創建一個表達式,可以從不同的對象打印字符串,並只寫入一次文件...因此function2是寫入文件的調用。參數1和參數2是文件路徑信息... – Steveng 2010-08-30 09:15:25

1

正如Frerich Raabe指出的,一種可能的解決方案是使用臨時對象的析構函數。然而,這確實強加,你會以某種方式需要內嵌調用所有的參數,從而禁止的語法如下:

auto stream = function1(param1, param2) << param3; 
stream << param4; 
stream << stringG; // call here 

標準庫中的IO流庫通過使用一個全局對象爲規避這一問題的「標記「:std::endl。這可能是另一種選擇。

請注意,如果您使用標記方式,則可以解除不需要複製的要求。

最後,關於實施的問題更多的是設計問題,所以這是您的要求。

class Stream 
{ 
public: 
    struct Marker {}; 
    static Marker End; 

    Stream(type1, type2); 

    void operator<<(Marker) const { function2(m1,m2); } 
    Stream& operator<<(...); 

private: 
    type1 m1; 
    type2 m2; 
}; 

玩得開心:)

0

您在結束其更容易這樣

class myfun { 
public: 
     void operator()(const string& param1, const string& param2, const string& values) const { 
       std::cout << "param1: " << param1 << "param2: " << param2 << " value: " << values << std::endl; 
     } 
}; 

class A { 
     string m_param1, m_param2; 
     string values; 
public: 
     A(string param1, string param2):m_param1(param1), m_param2(param2) { } 

     A& operator << (const string& str) { 
       values += str; 
       return *this; 
     } 

     A& operator << (const myfun& myfun) { 
       myfun(m_param1, m_param2, values); 
       return *this; 
     } 
     }; 

A fun(string param1, string param2) { 
     return A(param1, param2); 
}; 

int main() { 
     fun("a", "b") << "xyz" << myfun(); 
     return 0; 
}