Поскольку API довольно похожи между hpx
а также #include<thread>
возможно ли иметь один и тот же код для запуска hpx
или же #include<thread>
?
Так как повышение является требованием hpx
Мой пример использования здесь есть системы, которым не разрешено повышение, и некоторые из них, я хочу, чтобы один и тот же код работал на обоих, но использовать hpx
если возможно.
Предполагая, что я использую только функции, которые есть как в hpx, так и в потоке, есть ли пример для этого? Могу ли я даже через #ifdef
?
Если API обеих библиотек абсолютно одинаков, вы можете использовать псевдоним типа, который компилируется условно:
#if defined(USE_HPX_THREADS)
#include <hpx/thread.hpp>
namespace my_library
{
using my_thread = hpx::thread;
}
#elif defined(USE_STD_THREADS)
#include <thread>
namespace my_library
{
using my_thread = std::thread;
}
#endif
В качестве альтернативы, если API-интерфейсы различаются, вы можете создать свой собственный однородный интерфейс с различными реализациями в зависимости от определения препроцессора:
class my_thread
{
private:
// "Conditional type alias" like the example above.
my_thread_handle _thread;
public:
void join();
};
#if defined(USE_HPX_THREADS)
void my_thread::join()
{
_thread.hpx_join();
}
#elif defined(USE_STD_THREADS)
void my_thread::join()
{
_thread.std_join();
}
#endif
Это может быть хорошей идеей, чтобы разделить реализации в разных файлах. Проверьте библиотеки, такие как SFML для примера из реального мира (Папки Unix и Win32).
API-интерфейсы std::thread
а также hpx::thread
полностью идентичны, таким образом, using
Трюк, описанный Витторио, сделает свое дело.