PYBIND11_OVERLOAD_NAME and PYBIND11_OVERLOAD_PURE_NAME (fixes #205)
diff --git a/docs/advanced.rst b/docs/advanced.rst
index 4353536..032cf85 100644
--- a/docs/advanced.rst
+++ b/docs/advanced.rst
@@ -268,8 +268,14 @@
The macro :func:`PYBIND11_OVERLOAD_PURE` should be used for pure virtual
functions, and :func:`PYBIND11_OVERLOAD` should be used for functions which have
-a default implementation. The binding code also needs a few minor adaptations
-(highlighted):
+a default implementation.
+
+There are also two alternate macros :func:`PYBIND11_OVERLOAD_PURE_NAME` and
+:func:`PYBIND11_OVERLOAD_NAME` which take a string-valued name argument
+after the *Name of the function* slot. This is useful when the C++ and Python
+versions of the function have different names, e.g. ``operator()`` vs ``__call__``.
+
+The binding code also needs a few minor adaptations (highlighted):
.. code-block:: cpp
:emphasize-lines: 4,6,7
diff --git a/example/example12.ref b/example/example12.ref
index 2274cdd..a25023f 100644
--- a/example/example12.ref
+++ b/example/example12.ref
@@ -1,7 +1,7 @@
Constructing Example12..
Original implementation of Example12::run(state=10, value=20)
30
-Caught expected exception: Tried to call pure virtual function "pure_virtual"
+Caught expected exception: Tried to call pure virtual function "Example12::pure_virtual"
Constructing Example12..
ExtendedExample12::run(20), calling parent..
Original implementation of Example12::run(state=11, value=21)
diff --git a/example/issues.ref b/example/issues.ref
index 0bfaca0..4888ea5 100644
--- a/example/issues.ref
+++ b/example/issues.ref
@@ -1,6 +1,6 @@
const char *
c
-Failed as expected: Tried to call pure virtual function "dispatch"
+Failed as expected: Tried to call pure virtual function "Base::dispatch"
Yay..
[Placeholder[1], Placeholder[2], Placeholder[3], Placeholder[4]]
[3, 5, 7, 9, 11, 13, 15]
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h
index 02d81e6..34869eb 100644
--- a/include/pybind11/pybind11.h
+++ b/include/pybind11/pybind11.h
@@ -1184,19 +1184,25 @@
return overload;
}
-#define PYBIND11_OVERLOAD_INT(ret_type, class_name, name, ...) { \
+#define PYBIND11_OVERLOAD_INT(ret_type, name, ...) { \
pybind11::gil_scoped_acquire gil; \
- pybind11::function overload = pybind11::get_overload(this, #name); \
+ pybind11::function overload = pybind11::get_overload(this, name); \
if (overload) \
return overload(__VA_ARGS__).template cast<ret_type>(); }
-#define PYBIND11_OVERLOAD(ret_type, class_name, name, ...) \
- PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
- return class_name::name(__VA_ARGS__)
+#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
+ PYBIND11_OVERLOAD_INT(ret_type, name, __VA_ARGS__) \
+ return cname::fn(__VA_ARGS__)
-#define PYBIND11_OVERLOAD_PURE(ret_type, class_name, name, ...) \
- PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
- pybind11::pybind11_fail("Tried to call pure virtual function \"" #name "\"");
+#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
+ PYBIND11_OVERLOAD_INT(ret_type, name, __VA_ARGS__) \
+ pybind11::pybind11_fail("Tried to call pure virtual function \"" #cname "::" name "\"");
+
+#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
+ PYBIND11_OVERLOAD_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
+
+#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
+ PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
NAMESPACE_END(pybind11)