2017-03-29 1 views
0

ich die nächste Definition Klasse:Wie Register überladene Vorlage Mitglied Funktion in ChaiScript?

class MyType { 
public: 
    template <typename T> 
    MyType& put(const std::string& s, T&& val); 

    template <typename T> 
    MyType& put(size_t pos, T&& val); 

    template <typename M, typename T, typename = std::enable_if_t<std::is_same<MyType, std::decay_t<M>>::value>> 
    MyType& put(const M& o, T&& val); 
} 

Wie ist die richtige Art und Weise überlastet Template-Elementfunktionen MyType::put in ChaiScript v6.0.0 registrieren?

Ich spezialisiert Wertvorlage versuchen (Diskutiert in: http://discourse.chaiscript.com/t/issues-with-adding-templated-and-or-overloaded-operators/19/3):

chai.add(chaiscript::fun(static_cast<MyType& (MyType::*)(const std::string&, uint64_t)>(&MyType::put<uint64_t>), "put"); 

Aber nicht, weil es mehr Kandidaten Funktion kompilieren.

Antwort

1

Sie schrieb:

static_cast<MyType& (MyType::*)(const std::string&, uint64_t)>(
    &MyType::put<uint64_t>) 

Aber wenn Sie an Ihrem ersten Element Funktion aussehen, seine Unterschrift ist:

template <typename T> 
MyType& put(const std::string& s, T&& val); 

Wenn Tuint64_t ist, dann das zweite Argument ist nicht uint64_t. Es ist uint64_t&&. Also, was Sie wollen, ist:

static_cast<MyType& (MyType::*)(const std::string&, uint64_t&&)>(
    &MyType::put<uint64_t>) 
//             ~~~~~~~~~~~ 
+0

@ chema989 (1) Es ist eine Weiterleitung Referenz. (2) Wenn Sie einen lvalue übergeben, rufen Sie nicht 'put ' auf, Sie rufen 'put '. Es ist eine andere Instantiierung. – Barry

+0

Ja, ich muss jede unterschiedliche Instanz in ChaiScript registrieren. Danke @Barry. – chema989

Verwandte Themen