質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1374閲覧

std::format()を使って可変長引数を描画したい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/25 03:31

提示コードの////コメント部内部コードですが.Draw();関数で指定した文字列をstd::format関数を使って可変長文字列を生成したいのですがとりあえずstd::cout<<で表示する描画が異なります。これはなぜなのでしょうか?

参考サイト: https://cpprefjp.github.io/reference/format/format.html

イメージ説明

cpp

1 text.Draw(glm::vec2(100, 100), "Font/PressStart2P.ttf", 25, glm::vec4(0, 255, 0, 255), "Hello World ! {} ",a);

cpp

1 2// ##################################### 可変文字列 描画 ##################################### 3void FrameWork::Text::Draw(const glm::vec2 pos, const char* font, unsigned short pixel, const glm::vec4 color, const char *str,...) 4{ 5 //マルチバイト文字をワイド文字変換 6////////////////////////////////////////// 7 std::vector<char> charText(0); 8 va_list args = NULL; 9 va_start(args, str); 10 charText.clear(); 11 charText.resize(strlen(str) + 100); 12 //vsprintf_s(charText.data(), charText.size(), str, args); 13 std::string sr = std::format(str, args); 14 va_end(args); 15////////////////////////////////////////// 16 std::cout << sr << std::endl;//////////////////////////////////////////ここ 17 //std::format(); 18 19 20 21 22 //フォントサイズ、フォント名を変更する時 23 24 25 if (NULL == font) 26 { 27 std::cout << "文字列がNULL" << std::endl; 28 29 fontName = std::string(DEFAULT_FONT); //既定フォント 30 pixelSize = pixel; //ピクセルサイズ 31 32 setFontName(fontName.c_str()); //フォント 33 setPixelSize(pixelSize); //ピクセルサイズ 34 35 36 charText = charText; 37 text = getTexture(getWchar_t(charText), fontName.c_str(), pixelSize, face); //テクスチャを生成 38 } 39 else if ( (pixelSize != pixel) || (fontName != std::string(font))) 40 { 41 std::cout << "フォントサイズ、フォント名を変更する時" << std::endl; 42 if (font == NULL) 43 { 44 fontName = std::string(DEFAULT_FONT); 45 } 46 else 47 { 48 fontName = font; 49 } 50 51 pixelSize = pixel; //ピクセルサイズ 52 53 setFontName(fontName.c_str()); //フォント 54 setPixelSize(pixelSize); //ピクセルサイズ 55 56 57 charText = charText; 58 text = getTexture(getWchar_t(charText), fontName.c_str(), pixelSize, face); //テクスチャを生成 59 } 60 else if( std::string(charText.data()) != std::string(charText.data()) ) 61 { 62 std::cout << "FixText" << std::endl; 63 FixText(text,getWchar_t(charText)); 64 charText = charText; 65 } 66 else 67 { 68 std::cout << "ああああ" << std::endl; 69 } 70 71 setTextSize(textSize, text); //文字列のサイズを取得 72 73 74 75 RenderCharacter(pos, pixelSize,color, text); //文字描画 76}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/25 04:20

「参考サイト」はあなたが参考にしたサイト、という意味ではないのでしょうか。 読んだ上で、「std::string sr = std::format(str, args);」なんてことをしているのでしょうか。
guest

回答2

0

ベストアンサー

std::format()の実装ってもう存在していたのですね。

前の質問と同様に、可変長引数 ... の関数から可変引数テンプレート const T&... args の関数を呼ぶことは不可能だと思います。

std::vformat()というのもありますが、これはva_listを引数に取るわけではないので、やはり今のままでは Text::Draw()から呼ぶことはできません。

思いつく対処は、Text::Draw()を可変引数テンプレートに書き換えて、引数を展開するか std::forward()std::format() にわたすことです。

template <typename... Args> void Draw(const glm::vec2 pos, const char* font, unsigned short pixel, const glm::vec4 color, const char *str, const Args&... args) { ... std::format(str, args...);

投稿2021/06/25 05:07

編集2021/06/25 05:33
int32_t

総合スコア21695

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/25 05:27

質問ですが関数を以下ようにしたのですが未定義の外部参照というエラーが発生します。このコンパイルエラーはどうすればいいのでしょか? text.Draw<int>(glm::vec2(100, 100), "Font/PressStart2P.ttf", 25, glm::vec4(0, 255, 0, 255), "Hello World ! {} ",42);
int32_t

2021/06/25 05:33

どんなコードを書いたのかわかりませんから、的確な助言するのは難しそうです。 とりあえず Draw の後の <int> はいらないですね。
退会済みユーザー

退会済みユーザー

2021/06/25 05:45

<int>を消したのですがコンパイルエラー消えなのですが関数がtemplateの型場合どうやって指定するのでしょうか?
yumetodo

2021/06/25 05:51

推論されるのでは。
int32_t

2021/06/25 05:52

完全なコードと完全なエラーメッセージがないと的確な助言は難しいです。 質問文に追記するか別質問を立ててはどうでしょうか。
yumetodo

2021/06/25 05:52 編集

エラーのほうは関数定義をヘッダーファイルに書いてないとかそういうオチなのでは
guest

0

リファレンスを読もう/読めるようになろう。

「std::format は va_list を引数に取らない」ことをリファレンスから読み取ろう。

投稿2021/06/25 03:59

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/25 04:29

string message = format("The answer is {}.", 42); // => "The answer is 42." を読みました。が自分は可変引数を取りそれをここで文字列に変換したいのですが提示画像のような引数の場合どうすればいいのでしょうか?
episteme

2021/06/25 04:46

繰り返す。 「std::format は va_list を引数に取らない」
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問