본인 C++ 8년 했는데 오늘부로 C++접고 러스트함 그 이유를 설명해주려고함.
C++ 엔 알다시피 제대로된 async지원이 없음, std::async는 반쪽짜리임 왜냐고? 이새끼는 스레드풀링이 안되거든. 그자리에서 스레드를 생성하던가 sync dispatch를 해주는것뿐임. 근데 본인은 네트워크 관련 회사에 다님. 그럼 C++에서 async를 제대로 하려면 boost asio같은걸 써야함. 이새끼도 문제가 많은데 (버그가 존나게 많음) 그건 굳이 설명하지 않겠고 본제만 이야기하겠음. 이새끼는 async operation에서 promsie를 반환하지 않음. 그럼 씨발 std::bind로 promise를 넘겨서 콜백 안에서 처리해줘야하는데. 이게 진짜 존나게 맘에 안드는거임. 그래서 그걸 대체할걸 만들려고 했음.
그게 바로 이 코드임
template <class RetT, class... ArgsT>
constexpr auto wrap_future(std::future f, std::function<RetT(Args...)> handler)
{
return [=] (ArgsT... args) { return handler(args...); }
}
그래서 이 코드로 잘 쓰고 있었지. 한동안은....
근데 문제가 뭐였냐? 이새끼는 std::function만 캡처가 가능하다는거임.
알다시피 C++에는 Callable한 object type이 5가지가 있음
1. Lambda
2. std::function
3. operator()
4. function pointer.
5. bind에서 나온 타입
이걸 전부 지원하려면 wrap_future를 호출해줄때 std::function으로 explicit하게 바꿔줘야하는데 (template deduction이 explicit constructor에서는 불가능)
그걸 해주긴 싫었단 말이지. 왜냐고? 코드가 겁나게 길어지니까. (생각해보셈 wrap_signal(std::function<void()>([](){})); 이렇게 쓰고싶음?)
근데 이새끼는 여기서 2번째밖에 처리를 안 해주는거임. 여기서부터 개 삽질이 시작됨
일단 function pointer 이건 좀 쉬움
template <class FuncT>
constexpr auto wrap_future(std::future f, FuncT* func)
{
return wrap_future(f,std::function<FuncT>(func));
}
일단 Lambda랑 operator()부터 시작함 이새끼는 캡처를 하려면 이렇게 해야함
template <class ObjT, class ClassT, class RetT, class... ArgsT>
std::function<RetT(ArgsT...)> unbound_op(ObjT object, RetT(ClassT::*)(ArgsT) func)
{
return std::bind(std::mem_fn(func), object);
}
template <class ClassT>
constexpr auto wrap_future(std::future f, ClassT lambda)
{
return wrap_future(f, unbound_op(lambda, &ClassT::operator()));
}
이때부터 내가 현타가 오기 시작함 씨발 이 C++라는 새끼는 이딴걸 처리를 굳이 해줘야하는건가?
그래 뭐 이정도는 구현은 가능하니까 그렇다고 치자.
다음게 진짜 문제였음
이 std::bind 이새끼는 https://en.cppreference.com/w/cpp/utility/functional/bind 보면 알겠지만 리턴 타입이 unspecified임
그게 무슨 뜻이냐면 컴파일러마다 다르다는 의미임. 그니까 씨발 여기서 내가 argument type을 추출할수가 없다는거지
이때 딱 깨달음. 이거 그냥 씨발 11년 전부터 C++ executor만들던거 C++ 20에 넣어줬으면 해결된거 아닌가?
asio에 future ~ promise지원 했으면 해결된거 아닌가?
그냥 러스트를 썼으면 해결된거 아닌가?
그리고 결심함. 이번에 새로 infrastructure 만들던 구조만 3만줄 짜놓은 C++코드 갈아엎기로. C++ 손절하기로.
해당 댓글은 삭제되었습니다.
Network 인프라 엔진
async-std쓰면 전부 해결 가능
나도 진짜 진정한 C++빠라고 할만큼 열심히 했는데 C++ 관련 컨퍼런스 발표도 했고 Clang쪽 컨트리뷰팅도 했는데 이제 안 할거임. Rust 컨트리뷰터분들 아는사람 있는데 노예 하나 생겼다면서 좋아하더라. 난 러스트로 간다
물론 C++나 러스트나 똑바로 둘다 써보지도 않았으면서 뭐가 나쁘다 뭐가 좋다 하는 새끼들은 뒤져야한다고 생각함 ^ㅇ^
해당 댓글은 삭제되었습니다.
TMP는 개인프로젝트 흑마법 쓸 때 빼곤 안씀
언어적 기능은 굉장히 많음. 문제는 표준이 병신이지. 표준위원회놈들도 짜증나고
ㅇㅇ 그게정답인듯. 소프트웨어를 만들기 위한도구로서의 기능은 굉장히 적음.
장난질용 기능만 많노...
이것이 바로 모던 C++ - dc App
내가 보냈다
제가보냈는데요
위원회 : C++ 바로 잡겠다
ㅇㄱㄹㅇ임 이래서 파이썬 한번 깔짝 해봤는데 ㅅㅂ 레퍼런스 존나 좁고 불친절함
한 수 배우고 갑니다
언어적 기능은 엄청나게 복잡하고 많은데 (일반적 용도로) 그냥저냥 편하게 쓸만한 라이브러리가 stl빼고는 딱히 없는듯
난 옛날에 c++ 책 일주일 정도보다가.. 아... 이건 사람이 할 짓이 아니구나.. 시작도 안 했지 ㅋㅋ 아직도 c++ 까막눈이고 공부할 생각 엄슴
보기만 해도 C++은 토가 나오네. 뭐 이렇게 복잡하냐. 온갖 기능들이 다 짬봉되어 있나보네.
c++ 개병신인 건 백프로 공감가는데, 근데 버리고 러스트 쓰겠다는 건 굶어뒤지겠다는 소린데 ㅋㅋㅋ
FFI를 내가 직접 짜더라도 C++은 갖다 버릴거임.
단 하나의 답. The 「J.A.V.A」 King
운지해라
병신 자바충새끼 낄때껴라 ㅋㅋ
회사에서 사용중인 언어 휙휙바꿔도됨?
리드니까 상관없음
컴포넌트 단위로 바꿀거고 내가 바로 룰이기때문에. 이미 팀 안에서 메모리 이슈들 겪고 있던 참이고.