2014-02-26 72 views
0

我想推導函數的返回類型並將其用作成員函數的返回類型。爲此,我使用decltype表達式。但我所有的嘗試都失敗了編譯,如果給定函數需要一個引用作爲參數:如何推斷函數的返回類型,它需要參考作爲參數

  • 我不能用我的類中的任何成員變量在decltype表達,因爲編譯器會抱怨,有沒有這樣的成員(見func1以下)
  • 我不能使用臨時的函數參數,因爲該功能需要一個參考,你不能一個非const左值參考綁定到一個臨時的(見下文func2

我也嘗試過各種鑄造運營商要把參考拿到臨時,但似乎沒有是一個有效的表達。

下面一個代碼示例:

template<typename data_type, typename functor_type> 
class MyClass 
{ 
public: 
    auto func1() -> decltype(functor_type::process(this->m_data)) // <-- 
    { 
     return functor_type::process(m_data); 
    } 

    auto func2() -> decltype(functor_type::process(data_type{})) // <-- 
    { 
     return functor_type::process(m_data); 
    } 

private: 
    data_type m_data; 
}; 

struct Functor 
{ 
    static int process(int& a) { return a; } 
}; 

int main() 
{ 
    MyClass<int, Functor> m; 
    int b = m.func1(); 
    int c = m.func2(); 
} 
+3

對於'func1'一個工作,之前移動m_data'的'的聲明。 [實施例](http://coliru.stacked-crooked.com/a/53dcd44b0bc75005) – jrok

回答

1

第一個失敗,因爲類不是在函數聲明完整的,因爲它是在成員函數體,所以你只能使用已經聲明的成員。

對於第二個,標準庫提供了declval,這是一個聲明爲返回其模板參數類型的函數模板。當你需要一個特定類型的表達式時,你可以在未評估的上下文中使用它。

所以下面的版本應該工作:

#include <utility> // for declval 

template<typename data_type, typename functor_type> 
class MyClass 
{ 
private: 
    // Declare this before `func1` 
    data_type m_data; 

public: 
    // Use the already declared member variable 
    auto func1() -> decltype(functor_type::process(m_data)) 
    { 
     return functor_type::process(m_data); 
    } 

    // Or use `declval` to get an expression with the required reference type 
    auto func2() -> decltype(functor_type::process(std::declval<data_type&>())) 
    { 
     return functor_type::process(m_data); 
    } 
};  
2

我認爲你正在尋找std::declval<data_type&>()

相關問題