diff --git a/README.md b/README.md index ca70e2bd..de6b3e8d 100644 --- a/README.md +++ b/README.md @@ -347,7 +347,7 @@ namespace impl { Helper(const char* s, std::size_t len): s(s, len) {} template std::string operator()(Args&&... args) const { - return std::vformat(s, std::make_format_args(std::forward(args)...)); + return std::vformat(s, std::make_format_args(args...)); } }; } // namespace impl @@ -376,7 +376,7 @@ int main() { ```cpp constexpr auto operator""_f(const char* fmt, size_t) { - return[=](T&&... Args) { return std::vformat(fmt, std::make_format_args(std::forward(Args)...)); }; + return[=](T&&... Args) { return std::vformat(fmt, std::make_format_args(Args...)); }; } ``` @@ -431,7 +431,7 @@ namespace impl { Helper(const char* s, std::size_t len): s(s, len) {} template std::string operator()(Args&&... args) const { - return std::vformat(s, std::make_format_args(std::forward(args)...)); + return std::vformat(s, std::make_format_args(args...)); } }; } // namespace impl @@ -513,7 +513,7 @@ struct std::formatter:std::formatter{ } }; void print(std::string_view fmt,auto&&...args){ - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(fmt, std::make_format_args(args...)); } ``` @@ -532,20 +532,11 @@ void print(std::string_view fmt,auto&&...args){ ```cpp void print(std::string_view fmt,auto&&...args){ - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(fmt, std::make_format_args(args...)); } ``` -此处我们没有显示声明模板形参,所以展开时不能使用以往的模板形参做完美转发的模板实参,但是根据形参包展开的规则。例 -`args...`展开成`args1,args2,args3...`,而上式展开成 - -```cpp -std::forward(args1), -std::forward(arsg2), -std::forward(args3),... -``` - -这样我们对每个应用到的参数用 decltype 取他的类型再作为完美转发的模板参数。这样调用 `vformat`,返回 string,可以使用 cout 直接输出。 +这样调用 `vformat`,返回 string,可以使用 cout 直接输出。 而关于自定义 `std::formatter` 特化,我们需要知道的是:想要自定义 **std::formatter** 模板特化需要提供两个函数,**parse** 和 **format**。 diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" index 24592cd6..81dcbda6 100644 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" +++ "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" @@ -10,7 +10,7 @@ \subsection{答案} framesep=2mm]{c++} constexpr auto operator""_f(const char* fmt, size_t) { return [=](T&&... Args) { - return std::vformat(fmt, std::make_format_args(std::forward(Args)...)); + return std::vformat(fmt, std::make_format_args(Args...)); }; } \end{minted} @@ -80,7 +80,7 @@ \subsection{解析} Helper(const char* s, std::size_t len): s(s, len) {} template std::string operator()(Args&&... args) const { - return std::vformat(s, std::make_format_args(std::forward(args)...)); + return std::vformat(s, std::make_format_args(args...)); } }; } // namespace impl diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" index 0f2b4d89..57f3f2e9 100644 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" +++ "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" @@ -16,7 +16,7 @@ \subsection{标准答案} } }; void print(std::string_view fmt,auto&&...args){ - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(fmt, std::make_format_args(args...)); } \end{minted} @@ -32,26 +32,10 @@ \subsection{解析} framesep=2mm, breaklines]{c++} void print(std::string_view fmt,auto&&...args){ - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(fmt, std::make_format_args(args...)); } \end{minted} -由于使用了 C++20 简写函数模板,此处的完美转发就只能使用 decltype,显得有点诡异,其实很合理 - -展开的形式无非就是: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - std::forward(args1), - std::forward(arsg2), - std::forward(args3),... -\end{minted} - -这两个格式化函数没必要再介绍,和第第二题的作用一样,很简单的调库。 +这里实现策略使用了 C++20 简写函数模板。这两个格式化函数没必要再介绍,和第二题的作用一样,很简单的调库。 \clearpage \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/andyli.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/andyli.cpp" index 53325cde..1fc76bed 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/andyli.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/andyli.cpp" @@ -10,7 +10,7 @@ namespace impl { Helper(const char* s, std::size_t len): s(s, len) {} template std::string operator()(Args&&... args) const { - return std::vformat(s, std::make_format_args(std::forward(args)...)); + return std::vformat(s, std::make_format_args(args...)); } }; } // namespace impl diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/happyd0g.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/happyd0g.cpp" index f6d5439b..11b350a2 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/happyd0g.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/happyd0g.cpp" @@ -8,7 +8,7 @@ class formator { public: formator(const char* str):_inner_str(str) {} auto operator () (auto&&... args) { - return std::vformat(_inner_str, std::make_format_args(std::forward(args)...)); + return std::vformat(_inner_str, std::make_format_args(args...)); } private: const char* _inner_str; diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/loser_linker.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/loser_linker.cpp" index 33097c07..b10a22c0 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/loser_linker.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/loser_linker.cpp" @@ -10,7 +10,7 @@ struct FormatterStream { template std::string operator()(Args&&... args) { - return std::vformat(fmt_, std::make_format_args(std::forward(args)...)); + return std::vformat(fmt_, std::make_format_args(args...)); } std::string fmt_; diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/mq\345\215\242\347\221\237.cxx" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/mq\345\215\242\347\221\237.cxx" index 974cbb73..af3b104b 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/mq\345\215\242\347\221\237.cxx" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/mq\345\215\242\347\221\237.cxx" @@ -6,7 +6,7 @@ constexpr auto operator""_f(const char* str, size_t) { return [=](T&& ...args) { - return std::vformat(str, std::make_format_args(std::forward(args)...)); + return std::vformat(str, std::make_format_args(args...)); }; } diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\255\220\351\255\202.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\255\220\351\255\202.cpp" index 5fbd5df1..93a72906 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\255\220\351\255\202.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\255\220\351\255\202.cpp" @@ -5,9 +5,7 @@ constexpr auto operator ""_f(const char* s, size_t l) { - //return [s](auto&& ...vars){ return std::vformat(s, std::make_format_args(vars...)); }; - //改用完美转发 - return [s](auto&& ...vars){ return std::vformat(s, std::make_format_args(std::forward(vars)...)); }; + return [s](auto&& ...vars){ return std::vformat(s, std::make_format_args(vars...)); }; } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\277\203\346\264\227.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\277\203\346\264\227.cpp" index 91bd31c2..3df6a680 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\277\203\346\264\227.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\345\277\203\346\264\227.cpp" @@ -29,7 +29,7 @@ auto operator ""_f(const char* text, size_t) auto operator ""_f(const char* text, size_t) { return [text](auto&&... args) { - return std::vformat(text, std::make_format_args(std::forward(args)...)); + return std::vformat(text, std::make_format_args(args...)); }; } #endif diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" index 64668efc..10d1bc3d 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25402\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" @@ -9,7 +9,7 @@ struct Formatter { template std::string operator()(Args &&...args) const { - return std::vformat(fmt, std::make_format_args(std::forward(args)...)); + return std::vformat(fmt, std::make_format_args(args...)); } }; diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/CodeyZ.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/CodeyZ.cpp" index 28d22d34..a5d1eb8d 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/CodeyZ.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/CodeyZ.cpp" @@ -26,7 +26,7 @@ struct std::formatter { template auto print(std::string_view s,Args&&...args) { - std::cout << std::vformat(s,std::make_format_args(std::forward(args)...)) << '\n'; + std::cout << std::vformat(s,std::make_format_args(args...)) << '\n'; } int main() { diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/SocialMean.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/SocialMean.cpp" index d071a8a6..054244c9 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/SocialMean.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/SocialMean.cpp" @@ -16,7 +16,7 @@ struct std::formatter : std::formatter { template void print(const char* fmt, Args&&... args) { std::cout << std::vformat(fmt, - std::make_format_args(std::forward(args)...)) + std::make_format_args(args...)) << '\n'; } diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/happyd0g.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/happyd0g.cpp" index de5bbef2..60079e9b 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/happyd0g.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/happyd0g.cpp" @@ -14,7 +14,7 @@ struct std::formatter : std::formatter { }; void print(const char* str, auto&& ... args) { - std::cout << std::vformat(str, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(str, std::make_format_args(args...)); } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/jacky.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/jacky.cpp" index c0b6f7ea..bff5daff 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/jacky.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/jacky.cpp" @@ -16,7 +16,7 @@ struct std::formatter : std::formatter { constexpr void print(const char* fmt, auto&&... args) { - std::fputs(std::vformat(fmt, std::make_format_args(std::forward(args)...)).c_str(), stdout); + std::fputs(std::vformat(fmt, std::make_format_args(args...)).c_str(), stdout); } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/joe.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/joe.cpp" index 20deb031..acbf1773 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/joe.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/joe.cpp" @@ -23,7 +23,7 @@ struct std::formatter : std::formatter void print(const char* fmt, auto&& ...frac) { - std::cout<< std::vformat(fmt,std::make_format_args(std::forward(frac)...)); + std::cout<< std::vformat(fmt,std::make_format_args(frac...)); } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/loser_linker.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/loser_linker.cpp" index 4552bf88..5525a9d2 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/loser_linker.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/loser_linker.cpp" @@ -18,7 +18,7 @@ struct std::formatter : std::formatter template void print(char const * str, Args&&... args){ - std::cout << std::vformat(str,std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(str,std::make_format_args(args...)); } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\345\215\242\347\221\237.cxx" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\345\215\242\347\221\237.cxx" index 430e5c26..a00283ed 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\345\215\242\347\221\237.cxx" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\345\215\242\347\221\237.cxx" @@ -7,7 +7,7 @@ struct Frac { template void print(std::string_view format_str, Args const&... args) { - std::cout << std::vformat(format_str, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(format_str, std::make_format_args(args...)); } template<> diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\346\227\245.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\346\227\245.cpp" index 9bd86fe9..bdcfd378 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\346\227\245.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/mq\346\227\245.cpp" @@ -20,7 +20,7 @@ template<> struct std::formatter : std::formatter void print(const char *str, auto &&...args) { - std::cout << std::vformat(str, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(str, std::make_format_args(args...)); } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\255\220\351\255\202.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\255\220\351\255\202.cpp" index 8db09a4c..bb226339 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\255\220\351\255\202.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\255\220\351\255\202.cpp" @@ -4,7 +4,7 @@ void print(const char* s, auto&&... vars) { - std::cout << std::vformat(s, std::make_format_args(std::forward(vars)...)); + std::cout << std::vformat(s, std::make_format_args(vars...)); } struct Frac diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\277\203\346\264\227.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\277\203\346\264\227.cpp" index f82d4384..eb62490c 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\277\203\346\264\227.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\345\277\203\346\264\227.cpp" @@ -21,7 +21,7 @@ void print(auto&& text, auto&&... args) { std::cout << std::vformat( std::forward(text), - std::make_format_args(std::forward(args)...)); + std::make_format_args(args...)); } int main() diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" index a70bc07c..ee0eaee3 100644 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" +++ "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25403\351\242\230/\346\266\274\351\242\250\351\235\222\350\221\211.cpp" @@ -16,7 +16,7 @@ struct std::formatter : std::formatter { template void print(const T &fmt, Args &&...args) { - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); + std::cout << std::vformat(fmt, std::make_format_args(args...)); } int main() {