У Facebook есть несколько классных инженерных головоломок, которые мне нравятся, но они могут быть немного продвинутыми, чтобы только начать. Я - так себе программист C ++, поэтому я решил головоломки сначала в Python, а затем в C ++.
Ознакомьтесь с: Пазлы Facebook Engineering
В них, кажется, есть все: от простого (Hors d'oeuvre) до довольно сложного (Buffet).
Я полагаю, что эти головоломки были созданы для вербовки, но сами по себе они веселые. (Может быть, я немного отвратительный?)
Плюс, у них есть дополнительное преимущество: никогда не знаешь, когда тебе может понадобиться работа.
Это работает:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
Поскольку комплекс состоит из удвоений, он умножается на удвоения. Посмотрите на объявление:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(Следующее спасибо dribeas ) Компилятору не разрешено выполнять неявное преобразование типов во время вывода шаблона, поэтому, передав комплекс
с ] T double
, а затем другой T , являющийся int
, при попытке сопоставить функцию, обрабатывающую T как ] double
приводит к неправильному совпадению второго аргумента, и наоборот.
Для того, что вы хотите работать, должна быть определена функция, подобная этой:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
Что позволяет функции принимать различных типов, что позволяет выполнять приведение при вызове оператора * =
.
std :: complex
определены, чтобы принимать в качестве аргументов другие экземпляры complex
. Маршрут от int
через double
к сложному
немного слишком искажен / запутан для языка C ++, чтобы следовать ему в соответствии со стандартом (и с огромными сложностями, уже возникающими из-за произвольных преобразований и когерций, трудно критиковать этот аспект стандарта). Я предполагаю, что суперсобычный случай сложного
, разрешающий некастированные int
s в качестве операндов для своих операторов, просто не считался частым и достаточно важным, чтобы гарантировать указание специализаций шаблонов для этого чрезвычайно индивидуального кейс,