2017-03-29 3 views
0

J'ai la prochaine classe de définition:Comment le membre de modèle surchargé d'enregistrement fonctionne-t-il dans 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); 
} 

Comment est la bonne façon de membres register modèle surchargée fonctions MyType::put dans ChaiScript V6.0.0?

Je suis en train modèle de valeur spécialisée (Discuté dans: 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"); 

Mais ne compilera pas parce qu'il ya plusieurs fonctions de candidat.

Répondre

1

Vous avez écrit:

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

Mais si vous regardez votre première fonction de membre, sa signature est:

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

Si T est uint64_t, le second argument n'est pas uint64_t. C'est uint64_t&&. Par conséquent, ce que vous voulez est:

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

@ chema989 (1) C'est ce qu'on appelle une référence de renvoi. (2) Si vous passez une lvalue, vous n'appelez pas 'put ', vous appelez 'put '. C'est une instanciation différente. – Barry

+0

Oui, je dois enregistrer chaque instanciation différente dans ChaiScript. Merci @Barry. – chema989