Первый путь это использовать директивы препроцессора (дефайны):
void do_some() { #if defined(_IS_64_BIT_CPU) do_some_64(); #endif #if defined(_IS_32_BIT_CPU) do_some_32(); #endif }
Иногда, когда мы не имеем таких директив, можно определить разрядность процесора по размеру указателя (у 64-битных процессоров он очевидно равен 8 байтам, и соотсвественно у 32-разрядных процессоров он равен 4 байтам):
void do_some() { if(sizeof(void*) == 8) do_some_64(); if(sizeof(void*) == 4) do_some_32(); }
Это работающее решение, но нам не нужна одна из веток, т.е. мы хотим ее исключить на этапе компиляции. Можно с помощью C++11 написать такой код:
template<typename T = void*> std::enable_if_t<sizeof(T) == 8, void> do_some() { do_some_64(); } template<typename T = void*> std::enable_if_t<sizeof(T) == 4, void> do_some() { do_some_32(); }
Теперь на этапе компиляции будет включено только одно из определений функции - то, которое нам нужно.
Хотя, проще для чтения все же вариант с дефайнами, но второй вариант более универсален.
Комментариев нет:
Отправить комментарий