https://gist.github.com/liliilli/42cfa5d6a39390979a713aa4b56d4f49
템플릿 떡칠 X (SFINAE 는 씀)
익셉션 받아서 넘기느니 하는 복잡한 기능은 다 버림
에러코드 동작 방식은 std::error_code 랑 비슷하지만, 다 noexcept 으로 때린걸로 새로 만듦
void 형의 TResult 는 24Bytes.
실제로 잘 동작하진 몰겠는데 일단은 std::string 넣은 타입은 잘 동작함.
그냥 C같은 에러 핸들링 방식 (리턴 값은 인자로 넣고, 에러는 int 로 해서 리턴) 보다는 릴리즈 2배, 디버그 3배 느림.
근데 boost::outcome 의 빠른 방식인 outcome::result 의 경우엔 C 스타일이랑 비교하면 6배 느리니까 비교적 빠른건 맞음.
(outcome::outcome 의 경우엔 outcome::result 보다 2~3배 더 느려서 안쓰는게 나음)
(try/catch exception 의 경우엔 C스타일보다 121배 느림)
일단 boost 다 들어내고 요걸로 대체할 예정.
boost::outcome 이 좋은 점이 정확히 먼가여?? 막 빠르다 어쩌다 하는데 구체적으로 뭐가 어케 좋은지 모르겟음 리턴형이면 그냥 c 스타일루다가 하면 안댐?
C스타일루 하면 되긴하지만 모-던하지가 않잖아.... outcome 좋은 점은 익셉션까지 받아서 일반 C스타일 같은 형식으로 에러 핸들링을 수행할 수 있다는 점이랑, 익셉션이랑 비교하면 그래도 많이 빠른 점이 있음요
친절한 답변 고맙습니다
optional로는 안됨? 너무 저차원적이고 추상화가 안되나?
optional은 에러값을 못넣잖아
음.. 그러믄 make_pair로 V, int를 리턴하면? 너무 리소스 많이 잡아먹을래나
makr_pair 로 하면 V랑 int 그대로 가지고 가잖음. 에러가 아닌데 에러치도 같이 가져버리는데
예외가 거의 안나는 경우에는 오히려 개쓸데없는 오버헤드아님?
맞음. 그래서 에러가 터질 수 있는 함수에만 잘 넣어서 잘 써야함. 만약 메모리 얼록 같은게 돌아가는 곳이라면 써야지
std variant랑 다른게 머임?
variant 는 범용이지만, 이건 에러 코드 (Enum 밸류) 아니면 값으로만 구분되게 특수용도로 만들어진거임. 물론 에러 밸류를 얘 안에 집어넣으면 내부 로직에서는 알아서 해당 에러 밸류가 등록된 카테고리를 찾아서 메시지랑 에러 카테고리 이름을 내뱉을 수 있게 해줌
c++ 존나 더러워졌네 뭔 시발 코드를 하나도 알아볼수가 없노 ;;
SFINAE 써서 그럼