Cppformat에 대해서 알아봅시다 v 0.7

19
CppFormat http://cppformat.github.io/latest/

Transcript of Cppformat에 대해서 알아봅시다 v 0.7

Page 1: Cppformat에 대해서 알아봅시다 v 0.7

CppFormathttp://cppformat.github.io/latest/

Page 2: Cppformat에 대해서 알아봅시다 v 0.7

CppFormat

Page 3: Cppformat에 대해서 알아봅시다 v 0.7

라이브러리는 만들어진 이유가 있다 이런 유사한 기능을 수행하기 위한 방법들은 많음

Printf IOStream Boost Format FastFormat

그렇지만 이 라이브러리들은 심각한 이슈들을 갖고 있거나 필요로 하는 모든 기능들을 제공하지 않았다

Page 4: Cppformat에 대해서 알아봅시다 v 0.7

printf? printf 는 빠르고 C standard library 때부터 친숙한 녀석 주요 문제점이라면…

user-defined type 을 지원하지 않는다 또한 안전성 문제

Page 5: Cppformat에 대해서 알아봅시다 v 0.7

IOStreams IOStreams 의 문제는 다음의 예제 코드를 보면…

std::cout << std::setprecision(2) << std::fixed << 1.23456 << “\n”;

printf 에서는 위의 코드를 다음과 같이 간략화 가능 printf(“%.2f\n”, 1.23456);

Page 6: Cppformat에 대해서 알아봅시다 v 0.7

Boost Format Library? 굉장히 강력한 라이브러리 Printf 처럼 사용할 수도 있고 , 매개변수의 순서를 이용하는 방법도 제공 그렇지만 성능에서 큰 결점 여러 벤치마크에 따르면 다른 방법들보다 매우 ! 매우 ! 느립니다 . Boost Format 은 빌드에 걸리는 시간도 매우… 오래 걸립니다 .

Library Method Run Time, sEGLIBC 2.19 printf 1.30libstdc++ 4.8.2 std::ostream 1.85C++ Format 1.0 fmt::print 1.42tinyformat 2.0.1 tfm::printf 2.25Boost Format 1.54 boost::format 9.94

Page 7: Cppformat에 대해서 알아봅시다 v 0.7

Boost Format Library? Tinyformat 은 IOStreams 에 근접했지만 , 내부적으로 IOStream 을 사용하기 때문에 그보다 빨라질 수는 없습니다 cppformat 은 printf 에 근접했으며 , integer formattin 에서는 printf 보다 빠르기도 합니다

Library Method Run Time, sEGLIBC 2.19 printf 1.30libstdc++ 4.8.2 std::ostream 1.85C++ Format 1.0 fmt::print 1.42tinyformat 2.0.1 tfm::printf 2.25Boost Format 1.54 boost::format 9.94

Page 8: Cppformat에 대해서 알아봅시다 v 0.7

fmt::format Python 의 str.format 과 유사한 방법

반환값은 std::string type 중괄호 내부에 숫자를 넣어 매개변수 리스트에 접근 가능

Page 9: Cppformat에 대해서 알아봅시다 v 0.7

fmt::format wide char 또한 지원 그 뿐만 아니라 narrow char -> wide char 로의 변환도 가능

wide -> narrow 의 경우는 당연히 지원하지 않음

Page 10: Cppformat에 대해서 알아봅시다 v 0.7

fmt::format – Safety! 매개변수로 받은 값의 type 이 의도한 type 이 아닌 경우 compile error 를 발생시킬 수 있다

{:d}, {:s}, {:f} 등의 형식 지정자를 사용하여 전달받은 매개변수 타입이 일치하지 않는 경우 컴파일 에러 발생

위와 값이 parameter 의 순서와 fmt::arg 또는 operator”” _a 와 같이 사용 가능

Page 11: Cppformat에 대해서 알아봅시다 v 0.7

_format 마찬가지로 using namespace fmt::literals; 사용해야 함 fmt::format 함수를 간편하게 사용할 수 있습니다

Page 12: Cppformat에 대해서 알아봅시다 v 0.7

fmt::print 내부는 이렇게 생겼습니다 .

Page 13: Cppformat에 대해서 알아봅시다 v 0.7

fmt::arg & _a fmt::arg 는 ArgList 로 전달된 값에 이름을 지정할 수 있도록 해줌 operator”” _a 를 이용하여 간단하게 사용 가능

using namespace fmt::literals;

Page 14: Cppformat에 대해서 알아봅시다 v 0.7

FMT_VARIADIC FMT_VARIADIC 매크로를 사용하여 임의의 매개변수를 받아 formatting 하고 출력하는 자체 함수를 만들 수 있습니다 직접 template 함수를 만들 수도 있지만 , 제공하는 기능을 사용하면 더 간단합니다// Prints formatted error message.void report_error(const char *format, fmt::ArgList args) {fmt::print("Error: ");fmt::print(format, args);}FMT_VARIADIC(void, report_error, const char *)

Page 15: Cppformat에 대해서 알아봅시다 v 0.7

FMT_VARIADICreport_error("file not found: {}", path);

위와 같이 사용하면 됩니다 fmt::ArgList 매개변수를 받는 함수를 정의하기만 하면 됩니다 FMT_VARIADIC 이 매개변수에 접근하는 랩퍼를 자동으로 정의해줍니다

Page 16: Cppformat에 대해서 알아봅시다 v 0.7

fmt::MemoryWriter character stream 으로의 데이터 작성과 formatting 을 제공합니다 . 결과물은 동적으로 변경되는 메모리 버퍼에 저장됩니다 . 종류는 2 가지가 있습니다

MemoryWriter typedef BasicMemoryWriter<char, std::allocator<char>>

WMemoryWriter typedef BasicMemoryWriter<wchar_t, std::allocator<wchar_t>>

Page 17: Cppformat에 대해서 알아봅시다 v 0.7

fmt::MemoryWriter write 메소드

formatted data 를 작성

<< 연산자로도 제공하여 손쉽게 사용 가능

Page 18: Cppformat에 대해서 알아봅시다 v 0.7

fmt::MemoryWriter Move 시맨틱을 사용 , = 연산자를 이용하여 버퍼의 값을 옮길 수 있다

Page 19: Cppformat에 대해서 알아봅시다 v 0.7

fmt::MemoryWriter