2011-06-20 75 views
2

有沒有辦法找出一個函數的返回類型(或者甚至是一個函數指針的更好)是什麼?如何確定模板實例化時函數的返回類型?

我有下面的代碼,當我使用一個空函數指針打破,但對於任何其他的返回類型工作正常。使用gcc 4.5中的void函數指針時出現的錯誤是:

error: void value not ignored as it ought to be

這是有道理的。所以很顯然,我需要檢查函數指針是否返回某些內容,然後獲取結果並將其返回。

template <class F,typename R> class Instruction 
{ 
    protected: 
    F (func); 
    R result; 

    public: 

    template <typename T> 
    Instruction(T const& f) 
    { 
    func = &f; 
    }; 

    template <typename A> void execute(A const& a) 
    { 
    result = (func)(a); 
    }; 
    template <typename A> void execute(A const& a,A const& b) 
    { 
    result = (func)(a,b); 
    }; 
    template <typename A> void execute(A const& a,A const& b,A const& c) 
    { 
    result = (func)(a,b,c); 
    }; 
    R get_result() 
    { 
    return result; 
    }; 
}; 

通常,我用一個函數指針,該做的東西大多算術函數,我可以不是void功能的其他實例照顧任何返回類型。我嘗試實例化爲:

 Instruction<ptr2func2,void> foo(bar); 
    Instruction<ptr2func2,(*void)> foo(bar); 

但在兩種情況下都失敗。

在實例化的第二個模板參數是爲了用來定義返回類型是什麼。

+0

你並不需要檢查函數的返回類型,你只需要檢查'R'。這應該更容易,但我不知道如何。 – ikegami

回答

3

嘗試template partial specializationvoid

template <class F> class Instruction<F, void> 
{ 
    protected: 
    F (func); 

    public: 

    template <typename T> 
    Instruction(T const& f) 
    { 
    func = &f; 
    }; 

    template <typename A> void execute(A const& a) 
    { 
    (func)(a); 
    }; 
    template <typename A> void execute(A const& a,A const& b) 
    { 
    (func)(a,b); 
    }; 
    template <typename A> void execute(A const& a,A const& b,A const& c) 
    { 
    (func)(a,b,c); 
    }; 
}; 
+0

謝謝你的工作完美! 所以基本上我只用void來重載專門化的模板參數?謝謝,我應該先看過這個! :) –

+0

提示:因爲C++允許你'return'一個'void'表達式(他自己),這只是一個需要專業類的成員變量的一部分。這部分可以作爲基類或成員來分解。 –

1

您可能需要使用Boost::FunctionTypes其提供能夠分解函數類型,給你訪問到返回或參數類型元函數。

1

C++ 0x中,你可以decltype。但是,在C++ 03中,按照慣例,函數對象有一個result_type typedef,並且函數指針可以對它們應用模板推導。

相關問題