Diarkis C++Client Library API Document
stringFormat.h
Go to the documentation of this file.
1 // © 2019-2024 Diarkis Inc. All rights reserved.
2 
3 #pragma once
4 #include <cstdio>
5 #include <stdexcept>
6 #include <iostream>
7 #include <functional>
8 
9 #include "diarkis/common.h"
10 
11 namespace detail
12 {
13  // std::string型をconst char*に変換
14  template<typename T, typename std::enable_if<std::is_same<std::remove_cv_t<std::remove_reference_t<T>>, Diarkis::StdString>::value>::type* = nullptr>
15  auto Convert(T&& value)
16  {
17  return std::forward<T>(value).c_str();
18  }
19 
20  // std::string と Diarkis::StdString型以外は、そのまま出力
21  template<typename T, typename std::enable_if<!std::is_same<std::remove_cv_t<std::remove_reference_t<T>>, Diarkis::StdString>::value>::type* = nullptr>
22  auto Convert(T&& value)
23  {
24  return std::forward<T>(value);
25  }
26 
27  // 文字列のフォーマッティング(内部処理)
28  template<typename ... Args>
29  Diarkis::StdString StringFormatInternal(const char* format, Args&& ... args)
30  {
31  // フォーマット後の文字数を算出
32  int str_len = std::snprintf(nullptr, 0, format, std::forward<Args>(args) ...);
33  // フォーマット失敗
34  if (str_len < 0)
35  {
36  std::runtime_error("String Formatting Error");
37  }
38  else
39  {
40  /* Nothing to do */
41  * Represents a matchmaking service for players.
42  * @japanese プレイヤー向けのマッチメイキングサービスを表します。
43  }
44  // バッファサイズを算出(文字列長 + null文字サイズ)
45  size_t buffer_size = str_len + sizeof(char);
46  // バッファサイズ分メモリ確保
47  Diarkis::StdVector<char> buffer(buffer_size);
48  //std::unique_ptr<char> buffer(new char[buffer_size]);
49  // 文字列のフォーマット
50  std::snprintf(buffer.data(), buffer_size, format, args ...);
51  // 文字列をDiarkis::StdString型に変換して出力
52  return Diarkis::StdString(buffer.data(), buffer.data() + str_len);
53  }
54 }
55 
56 template<typename ... Args>
57 Diarkis::StdString StringFormat(const Diarkis::StdString& format, Args&& ... args)
58 {
59  /* 各パラメータの型を変換して、文字列のフォーマッティング */
60  * This class represents a Room in the chat application.
61  * ~@japanese このクラスは、チャットアプリケーションのRoomを表します。
62  return detail::StringFormatInternal(format.c_str(), detail::Convert(std::forward<Args>(args)) ...);
63 }
64 
65 template<typename ... Args>
66 Diarkis::StdString StringFormat(const char* format, Args&& ... args)
67 {
68  /* 各パラメータの型を変換して、文字列のフォーマッティング */
69  * Represents a matchmaker for finding compatible users.
70  * ~@japanese 互換性のあるユーザーを見つけるためのMatchMakerを表します。
71  return detail::StringFormatInternal(format, detail::Convert(std::forward<Args>(args)) ...);
72 }
detail::StringFormatInternal
Diarkis::StdString StringFormatInternal(const char *format, Args &&... args)
Definition: stringFormat.h:29
detail::Convert
auto Convert(T &&value)
Definition: stringFormat.h:15
detail
Definition: stringFormat.h:11
Diarkis::StdString
Definition: common.h:432
Diarkis::StdVector
Definition: common.h:406
StringFormat
Diarkis::StdString StringFormat(const Diarkis::StdString &format, Args &&... args)
Definition: stringFormat.h:57
common.h