본인 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++ 손절하기로.