template<typename T>
struct Point
{
Point(T x_, T y_)
:
x(x_),
y(y_)
{
};
T x;
T y;
};
template<typename T, template<typename E> class C = Point,
typename = typename std::enable_if<
std::is_arithmetic<T>::value ||
std::is_same<std::decay_t<C<T>>, Point<T>>::value>::type>
auto CalcDist(C<T>&& pt1, C<T>&& pt2)
{
return std::sqrt(
((pt1.x - pt2.x) * (pt1.x - pt2.x)) +
((pt1.y - pt2.y) * (pt1.y - pt2.y)));
}
int main()
{
Point<float> pt1(2, 4);
Point<float> pt2(5, 5);
auto res_pt = CalcDist(pt1, pt2);
return 0;
}
위에 있는 CalcDist 함수는 두 점 사이의 거리를 구하는 함수야
일단 enable_if로 산술 형식 타입인 Point struct만 받도록 조건을 걸어 놨어
문제는 저 함수 파라미터가 rvalue로만 받아지더라... 함수 파라미터를 rvalue lvalue 둘 다 받는 퍼펙트 포워딩으로 동작하게 만들고 싶은데 저 함수를 어케 수정해야 하냐?
내 빡대가리로는 도저히 저거 건들지 못하겠네 ㅠㅠ
좀 도와줘...
우윽 씹.. 이짓을 왜함?
애초에 퍼펙 포워딩은 사용된적이 읍고 원하는건 걍 auto CalcDist(C<T>& pt1, C<T>& pt2)하면 될꺼
어??? 뭐지??? 우리 게이 말 대로 하니깐 CalcDist(Point(2, 4), Point(5, 5)); 이 코드 컴파일 되네???
함수 오버로딩 모름?
그거 하면 rvalue 받는 거 따로 lvalue 받는 거 따로 두 개 작성해야 하잖아... 그거 싫어서 퍼펙 포워딩 할려고 하는건디...
아 내가 위에서 const를 빼먹었구만 auto CalcDist(C<T> const& pt1, C<T> const& pt2)