2016-08-20 20 views
3

對C++來說是相當新穎的。假設我有一個類:C++帶指針作爲參數的外部函數,用於具有成員函數的類中使用

class A 
{ 
private: 
    double m_x, m_y; 
public: 
    A(double x, double y): m_x {x} 
    { 
     m_y = extF(m_x, y, *intF); 
    } 

    double intF(double x) { return 2*x; } 
}; 

而且它利用外部全局的功能,其他地方定義的:

double extF(double x, double y, std::function<double(double)> f) 
{ 
    if (x*y < 0) 
     return f(x); 
    else 
     return f(y); 
} 

公式是假的。這不會編譯。我試過簡單的intF,A::*intF,&A::intF,甚至有些非正統的組合,但這只是猜測。問題在於A類不是唯一使用全局外部函數的類,它應該能夠在運行時作爲用戶選擇。搜索發現了一些答案,說它不可能像這樣做一個成員函數的指針,因爲它需要實例化(?),但我沒有找到解決方案。這可以做到嗎?如果是,如何?


編輯:另外一個問題:如何才能指針成員函數,如果成員函數是const double f(...) const做了什麼?

+0

如果它不訪問類的任何成員,則使'intF'靜態成員函數。 – songyuanyao

+0

@songyuanyao不幸的是,它確實如此。如果我知道這是一個問題,我會修改要顯示的代碼。 –

+0

@aconcernedcitizen不是你的錯,而是我的錯。我先OT,刪除這些評論。 –

回答

3

一個變型,只是使用拉姆達:

class A 
{ 
private: 
    double m_x, m_y; 
public: 
    A(double x, double y): m_x {x} 
    { 
     m_y = extF(m_x, y, [&](double d){ return intF(d);}); 
    } 

    double intF(double x) { return 2*x; } 
}; 

另一個變體是使用Lambda和std::mem_fn(省略你班上的其他代碼):

A(double x, double y): m_x {x} 
{ 
    auto fn = std::mem_fn(&A::intF); 
    m_y = extF(m_x, y, [&](double d) {return fn(this, d);}); 
} 

而且如果你的bind成員函數指針的對象參數最後你可以去掉lambdas:

A(double x, double y): m_x {x} 
{ 
    auto fn1 = std::bind(std::mem_fn(&A::intF), this, std::placeholders::_1); 
    m_y = extF(m_x, y, fn1); 
} 

所有這些也適用於常量成員函數。

+0

謝謝你們倆(@songuyanyao和你)的回答。我不知道'std :: mem_fn'和'std :: bind'。我現在會閱讀有關它們。 –

2

您可以使用std::bind來綁定成員函數。

A(double x, double y): m_x {x} 
{ 
    using namespace std::placeholders; 
    m_y = extF(m_x, y, std::bind(&A::intF, this, _1)); 
} 

或使用lambda

A(double x, double y): m_x {x} 
{ 
    m_y = extF(m_x, y, [this](double d) { return intF(d); }); 
} 

順便說一句:它適用於const成員函數,這在這裏並不重要。

LIVE

相關問題