2017-01-12 3 views
2

Я хочу написать некоторый код для совместимости с различными версиями boost, и вы хотите использовать соответствующие функции для данных форсированных версий. Сейчас я пытаюсь,Макросы препроцессора для разных имен функций

#if BOOST_VERSION>105000 
#define boost_sleep boost::this_thread::sleep_for 
#define millisectime boost::chrono::milliseconds 
#define  timed_join try_join_for 
#else 
#define boost_sleep boost::this_thread::sleep 
#define millisectime boost::posix_time::milliseconds 
#endif 

Который, кажется, компилируется отлично. Я использую его в коде с чем-то вроде:

// Wait for no reason, 
boost_sleep(millisectime(1000)); 

if(!(workerThread->timed_join(millisectime(1000)))){ 
    cout << "Not joined on time" << endl; 
    workerThread->detach(); 
} 

Есть ли лучший/стандартный способ для этого? любые предложения по улучшению этого?

+2

Как и в стороне: весь код, который вы пишете является стандартным C++ от C++ 11 – AndyG

+0

Да, планируем перейти на C++ 11, но на данный момент я пытаюсь изменить наименьшее количество кода. ..! лол. (Мне все еще нужно повысить количество контейнеров с несколькими индексами) – xcorat

ответ

2

Ваши определения - это псевдонимы; Для этого C++ не нужен препроцессор.

I.e.

#if BOOST_VERSION>105000 
using millisectime = boost::chrono::milliseconds; 
void boost_sleep(millisectime t) { boost::this_thread::sleep_for(t); } 
#else 
... 
+0

Подождите, когда я сделал первый запрос, говоря, что миллисекунды не являются членами ...! Но я проверю, THX! – xcorat

+0

@ xcorat: Я просто скопировал ваши имена. – MSalters

1

Макрос работает, но возникает проблема, заключающаяся в том, что вы можете случайно заменить что-то другое, кроме функции boost. Возможно, один из сторонних заголовков, которые вы включаете, определяет переменную или функцию или что-либо с идентификатором timed_join или millisectime. Возможно, это определение находится в пространстве имен недокументированной реализации.

Замена макроса для типов: псевдоним типа.

typedef boost:: 
#if BOOST_VERSION>105000 
    chrono 
#else 
    posix_time 
#endif 
    ::milliseconds millisectime; 

Замена макросов для функций: Оберточная функция.

void boost_sleep(millisectime m) { 
    return boost::this_thread::sleep 
#if BOOST_VERSION>105000 
    _for 
#endif 
    (m); 
} 

Обертывание функции члена изменит использование немного

void timed_join(boost_thread_type& t, millisectime m) { 
    t-> 
#if BOOST_VERSION>105000 
    try_join_for 
#else 
    timed_join 
#endif 
    (m); 
} 

Использование:

timed_join(workerThread, millisectime(1000)); 
Смежные вопросы