-template <> XBT_PUBLIC CommPtr Mailbox::get_async<void>(void** data);
-template <> XBT_PUBLIC void* Mailbox::get<void>();
-template <> XBT_PUBLIC void* Mailbox::get<void>(double timeout);
+template <typename T> CommPtr Mailbox::get_async(T** data)
+{
+ CommPtr res = get_init();
+ res->set_dst_data(reinterpret_cast<void**>(data), sizeof(void*));
+ res->vetoable_start();
+ return res;
+}
+
+template <typename T> T* Mailbox::get()
+{
+ T* res = nullptr;
+ get_async<T>(&res)->wait();
+ return res;
+}
+
+template <typename T> T* Mailbox::get(double timeout)
+{
+ T* res = nullptr;
+ get_async<T>(&res)->wait_for(timeout);
+ return res;
+}