Можно ли написать код, который может переключаться между потоками HPX и C ++ 1x?

Поскольку API довольно похожи между hpx а также #include<thread> возможно ли иметь один и тот же код для запуска hpx или же #include<thread>?

Так как повышение является требованием hpxМой пример использования здесь есть системы, которым не разрешено повышение, и некоторые из них, я хочу, чтобы один и тот же код работал на обоих, но использовать hpx если возможно.

Предполагая, что я использую только функции, которые есть как в hpx, так и в потоке, есть ли пример для этого? Могу ли я даже через #ifdef?

1

Решение

Если 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).

3

Другие решения

API-интерфейсы std::thread а также hpx::thread полностью идентичны, таким образом, using Трюк, описанный Витторио, сделает свое дело.

1

По вопросам рекламы [email protected]