Skip to content

Commit 8e148d1

Browse files
committed
実装例を追加
1 parent 3b1b618 commit 8e148d1

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

reference/format/format_to_n.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,74 @@ int main()
111111
The answer is 42.
112112
```
113113

114+
115+
## 実装例
116+
117+
```cpp
118+
template<class CharT, class Out>
119+
class Wrapper {
120+
std::iter_difference_t<Out> count_ = 0;
121+
std::iter_difference_t<Out> max_count_;
122+
Out out_;
123+
124+
public:
125+
using value_type = CharT;
126+
127+
Wrapper(Out out, std::iter_difference_t<Out> max_count)
128+
: max_count_(max_count)
129+
, out_(std::move(out))
130+
{}
131+
132+
constexpr void push_back(const value_type& value) {
133+
if (count_ < max_count_) {
134+
*out_ = value;
135+
++out_;
136+
}
137+
++count_;
138+
}
139+
140+
constexpr std::format_to_n_result<Out> result() const {
141+
return {out_, count_};
142+
}
143+
};
144+
145+
template<class Out, class... Args>
146+
format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, format_string<Args...> fmt, Args&&... args) {
147+
Wrapper<char, Out> wrapper(out, n);
148+
format_to(back_inserter(wrapper), fmt, forward<Args>(args)...);
149+
return wrapper.result();
150+
}
151+
152+
template<class Out, class... Args>
153+
format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, wformat_string<Args...> fmt, Args&&... args) {
154+
Wrapper<wchar_t, Out> wrapper(out, n);
155+
format_to(back_inserter(wrapper), fmt, forward<Args>(args)...);
156+
return wrapper.result();
157+
}
158+
159+
template<class Out, class... Args>
160+
format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, const locale& loc, format_string<Args...> fmt, Args&&... args) {
161+
Wrapper<char, Out> wrapper(out, n);
162+
format_to(back_inserter(wrapper), loc, fmt, forward<Args>(args)...);
163+
return wrapper.result();
164+
}
165+
166+
template<class Out, class... Args>
167+
format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, const locale& loc, wformat_string<Args...> fmt, Args&&... args) {
168+
Wrapper<wchar_t, Out> wrapper(out, n);
169+
format_to(back_inserter(wrapper), loc, fmt, forward<Args>(args)...);
170+
return wrapper.result();
171+
}
172+
```
173+
* format_string[link basic_format_string.md]
174+
* wformat_string[link basic_format_string.md]
175+
* format_to[link format_to.md]
176+
* locale[link /reference/locale/locale.md]
177+
* forward[link /reference/utility/forward.md]
178+
* back_inserter[link /reference/iterator/back_inserter.md]
179+
* iter_difference_t[link /reference/iterator/iter_difference_t.md]
180+
181+
114182
## バージョン
115183
### 言語
116184
- C++20

reference/format/formatted_size.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,59 @@ int main()
7878
17
7979
```
8080

81+
## 実装例
82+
83+
```cpp
84+
template<class CharT>
85+
class Counter {
86+
size_t count_ = 0;
87+
public:
88+
using value_type = CharT;
89+
90+
constexpr void push_back(const value_type&) {
91+
count_++;
92+
}
93+
94+
constexpr size_t size() const {
95+
return count_;
96+
}
97+
};
98+
99+
template<class Out, class... Args>
100+
size_t formatted_size(format_string<Args...> fmt, const Args&... args) {
101+
Counter<char> counter;
102+
format_to(back_inserter(counter), fmt, forward<Args>(args)...);
103+
return counter.size();
104+
}
105+
106+
template<class Out, class... Args>
107+
size_t formatted_size(wformat_string<Args...> fmt, const Args&... args) {
108+
Counter<wchar_t> counter;
109+
format_to(back_inserter(counter), fmt, forward<Args>(args)...);
110+
return counter.size();
111+
}
112+
113+
template<class Out, class... Args>
114+
size_t formatted_size(const locale& loc, format_string<Args...> fmt, const Args&... args) {
115+
Counter<char> counter;
116+
format_to(loc, back_inserter(counter), fmt, forward<Args>(args)...);
117+
return counter.size();
118+
}
119+
120+
template<class Out, class... Args>
121+
size_t formatted_size(const locale& loc, wformat_string<Args...> fmt, const Args&... args) {
122+
Counter<wchar_t> counter;
123+
format_to(loc, back_inserter(counter), fmt, forward<Args>(args)...);
124+
return counter.size();
125+
}
126+
```
127+
* format_string[link basic_format_string.md]
128+
* wformat_string[link basic_format_string.md]
129+
* format_to[link format_to.md]
130+
* locale[link /reference/locale/locale.md]
131+
* forward[link /reference/utility/forward.md]
132+
* back_inserter[link /reference/iterator/back_inserter.md]
133+
81134
## バージョン
82135
### 言語
83136
- C++20

reference/format/vformat.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,43 @@ namespace std {
4444
4545
フォーマット実行時に失敗した場合、[`format_error`](format_error.md)を投げる。
4646
47+
## 実装例
48+
49+
```cpp
50+
string vformat(string_view fmt, format_args args) {
51+
string str;
52+
vformat_to(back_inserter(str), fmt.str, args);
53+
return str;
54+
}
55+
56+
string vformat(wstring_view fmt, wformat_args args) {
57+
wstring str;
58+
vformat_to(back_inserter(str), fmt.str, args);
59+
return str;
60+
}
61+
62+
string vformat(const locale& loc, string_view fmt, format_args args) {
63+
string str;
64+
vformat_to(loc, back_inserter(str), fmt.str, args);
65+
return str;
66+
}
67+
68+
string vformat(const locale& loc, wstring_view fmt, wformat_args args) {
69+
wstring str;
70+
vformat_to(loc, back_inserter(str), fmt.str, args);
71+
return str;
72+
}
73+
```
74+
* string[link /reference/string/basic_string.md]
75+
* wstring[link /reference/string/basic_string.md]
76+
* string_view[link /reference/string_view/basic_string_view.md]
77+
* wstring_view[link /reference/string_view/basic_string_view.md]
78+
* format_args[link /reference/format/basic_format_args.md]
79+
* wformat_args[link /reference/format/basic_format_args.md]
80+
* locale[link /reference/locale/locale.md]
81+
* vformat_to[link vformat.md]
82+
* back_inserter[link /reference/iterator/back_inserter.md]
83+
4784
## バージョン
4885
### 言語
4986
- C++20

0 commit comments

Comments
 (0)