4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++20でstd::formatを使おうとしたらコンパイラ側でまだ実装されていなかった話

Last updated at Posted at 2022-11-08

要約

https://cpprefjp.github.io/reference/format/format.html

string message = format("The answer is {}.", 42); // => "The answer is 42."

を読んで、
「最近の C++ は Python みたいなフォーマットで文字列の書式を指定できるようになったんか!めっちゃ便利やん!」
と思って C++20 で std::format を使おうとしたが、GCClibstdc++ ではまだ std::format() が実装されていなかったというお話

環境・バージョン

~$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

コンパイルしようとしたらエラーが発生

hello.cpp
#include <format>
#include <iostream>

int main()
{
    std::cout << std::format("The answer is {}.", 42) << std::endl;
}
$ g++ -std=c++2a hello.cpp
hello.cpp:1:10: fatal error: format: No such file or directory
    1 | #include <format>
      |          ^~~~~~~~
compilation terminated.

GCC libstdc++ のドキュメントを読んでみる

https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2020

gcc.png

「Text formatting」のStatus(実装されたバージョン) が空欄になっている
つまり、まだ実装されていないという状態...

回避策

A. std::format() が実装されているコンパイラを使う

https://en.cppreference.com/w/cpp/compiler_support
compiler_support.png

Clang libc++MSVC STL は実装済なので、このどちらかを使う

B. {fmt} を使う

{fmt} は std::format の実装
依存関係を追加して、ライブラリを使えば良い

おわりに

C/C++ は文字列の書式周りがやや不便だなと感じました...

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?