Фон
Я работаю над проектом C ++ в области высокопроизводительных вычислений с использованием MPI. У меня есть функция с несколькими различными перегрузками, которую я использую для преобразования различных типов в строки:
void append(std::string& s, int value);
void append(std::string& s, void* value);
void append(std::string& s, MPI_Request request);
Это работало нормально, когда я использовал Open MPI. В OpenMPI MPI_Request
является псевдонимом для ompi_request_t*
, поэтому каждая перегрузка имеет свою сигнатуру.
Однако недавно я попытался скомпилировать код с помощью MPICH. В MPICH MPI_Request
является псевдонимом для int
, и в результате вышеприведенный код не может быть скомпилирован, потому что append
определен для int
дважды:
/home/me/NimbleSM/src/mpi-buckets/src/mpi_err.hpp: At global scope:
/home/me/NimbleSM/src/mpi-buckets/src/mpi_err.hpp:28:6: error: redefinition of ‘void append(std::__cxx11::string&, int)’
void append(std::string& s, int i) { s.append(std::to_string(i)); }
^~~
/home/me/NimbleSM/src/mpi-buckets/src/mpi_err.hpp:17:6: note: ‘void append(std::__cxx11::string&, MPI_Request)’ previously defined here
void append(std::string& s, MPI_Request request)
Вопрос
Как мне написать append(std::string&, MPI_Request)
, чтобы компилятор игнорировал его, когда MPI_Request
определен как int
, но распознал, когда MPI_Request
- это тип библиотеки?
Попытка решения: enable_if
не удалось
Я попытался написать решение на основе std::enable_if
, где функция включается только в том случае, если MPI_Request
отличается от int
.
auto append(std::string& s, MPI_Request request)
-> typename std::enable_if<!std::is_same<MPI_Request, int>::value, void>::type
{
str(s, (void*)request);
}
Это терпит неудачу, потому что, когда MPI_Request
совпадает с int
, оператор всегда ложен, и, поскольку он не зависит от каких-либо параметров шаблона, компилятор отказывается компилировать его.
Как это исправить и сделать append
зависимым от MPI_Request
, отличным от int
?