2016-10-19 91 views
2

我想創建一個模板類,其變量模板參數與給定的std::function相同。例如從std :: function複製模板參數

template <typename T> 
struct function_traits : public function_traits<decltype(&T::operator())> {}; 

template <typename ClassType, typename ReturnType, typename... Args> 
struct function_traits<ReturnType(ClassType::*)(Args...) const> { 
    template <template<typename... TArgs> class T> 
    using ArgsCopy = T<Args...>; 
}; 

template <typename... Args> 
class _forwarder { 
public: 
    using cb = std::function<void(Args...)>; 

    void operator()(Args... args) { 
     my_cb(args...); 
    } 

private: 
    cb my_cb; 
}; 

template <typename T> 
using Forwarder = function_traits<T>::ArgsCopy<_forwarder>; 

我會再使用這個類如下

using cb_test = std::function<void(int, float, std::string)>; 
Forwarder<cb_test> fwd; 
fwd(5, 3.2, "hello"); 

Visual Studio中拋出一個編譯錯誤:錯誤C2061:語法錯誤:標識符 'ArgsCopy'。我該如何解決?

+0

'模板使用Forwarder = function_traits :: template ArgsCopy <_forwarder>;' – aschepler

回答

3

微軟的編譯器不嚴格遵循這裏的標準,並增加template應該工作:

template <typename T> 
using Forwarder = function_traits<T>::template ArgsCopy<_forwarder>; 

但如果你想你的代碼移植,加typename

template <typename T> 
using Forwarder = typename function_traits<T>::template ArgsCopy<_forwarder>; 
相關問題