Следующий код
#include <vector>
#include <complex>
#include <algorithm>
template<class K>
inline void conjVec(int m, K* const in) {
static_assert(std::is_same<K, double>::value || std::is_same<K, std::complex<double>>::value, "");
if(!std::is_same<typename std::remove_pointer<K>::type, double>::value)
#ifndef OK
std::for_each(in, in + m, [](K& z) { z = std::conj(z); });
#else
std::for_each(reinterpret_cast<std::complex<double>*>(in), reinterpret_cast<std::complex<double>*>(in) + m, [](std::complex<double>& z) { z = std::conj(z); });
#endif
}
int main(int argc, char* argv[]) {
std::vector<double> nums;
nums.emplace_back(1.0);
conjVec(nums.size(), nums.data());
return 0;
}
отлично компилируется в Linux с
- Дебиан лязг версии 3.5.0-9
- gcc версии 4.9.1
- icpc версия 15.0.1
и в Mac OS X с
- gcc версии 4.9.2
но не с
- лязг-600.0.56
- icpc версия 15.0.1
кроме случаев, когда макрос OK
определен. Я не знаю, какие компиляторы неисправны, может кто-нибудь сообщить мне? Спасибо.
пс: вот ошибка
10:48: error: assigning to 'double' from incompatible type 'complex<double>'
std::for_each(in, in + m, [](K& z) { z = std::conj(z); });
K = std::complex<double>
, нет? - person BigDawg   schedule 23.01.2015if
как (несуществующий)static if
. Просто напишите две перегрузки. (Кроме того,remove_pointer
не имеет смысла. Ниdouble
, ниcomplex<double>
не являются указателями.) - person T.C.   schedule 23.01.2015remove_pointer
. Почему вы рекомендуете использовать две перегрузки, если я определяю макросOK
, код компилируется и работает нормально как дляdouble
, так и дляcomplex<double>
на всех платформах, и я полагаю, что стоимость выполнения этой реализации не намного больше, чем с двумя перегрузками? - person BigDawg   schedule 23.01.2015