如何在ChaiScript 中注册重载的模板成员函数?
How register overloaded template member function in ChaiScript?
我有下一个定义class:
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);
}
如何在 ChaiScript v6.0.0 中注册重载模板成员函数的正确方法 MyType::put
?
我正在尝试专用值模板(讨论于: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");
但是因为有几个候选函数不能编译
您写道:
static_cast<MyType& (MyType::*)(const std::string&, uint64_t)>(
&MyType::put<uint64_t>)
但是如果你看一下你的第一个成员函数,它的签名是:
template <typename T>
MyType& put(const std::string& s, T&& val);
如果 T
是 uint64_t
,则第二个参数不是 uint64_t
。是 uint64_t&&
。因此,你想要的是:
static_cast<MyType& (MyType::*)(const std::string&, uint64_t&&)>(
&MyType::put<uint64_t>)
// ~~~~~~~~~~~
我有下一个定义class:
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);
}
如何在 ChaiScript v6.0.0 中注册重载模板成员函数的正确方法 MyType::put
?
我正在尝试专用值模板(讨论于: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");
但是因为有几个候选函数不能编译
您写道:
static_cast<MyType& (MyType::*)(const std::string&, uint64_t)>(
&MyType::put<uint64_t>)
但是如果你看一下你的第一个成员函数,它的签名是:
template <typename T>
MyType& put(const std::string& s, T&& val);
如果 T
是 uint64_t
,则第二个参数不是 uint64_t
。是 uint64_t&&
。因此,你想要的是:
static_cast<MyType& (MyType::*)(const std::string&, uint64_t&&)>(
&MyType::put<uint64_t>)
// ~~~~~~~~~~~