2016-10-19 3 views
2

Ich möchte eine Template-Klasse erstellen, deren Variable Vorlage Argumente sind die gleichen wie eine gegebene std::function. Zum BeispielKopiere Vorlagenargumente von 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>; 

würde ich dann diese Klasse verwenden als

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

Visual Studio folgt eine Zusammenstellung Fehler führt: Fehler C2061: Syntaxfehler: Bezeichner 'ArgsCopy'. Wie behebe ich das?

+0

'template mit Forwarder = function_traits :: Vorlage ArgsCopy <_forwarder>; ' – aschepler

Antwort

3

Microsofts Compiler nicht exakt mit der Standard hier folgen, und das Hinzufügen von template sollte funktionieren:

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

Aber wenn Sie Ihren Code möchten hinzufügen tragbar sein typename:

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