我有代码,允许您在任何类上创建一个std::string format()
函数,并允许该类在调用中使用它std::format()
。为此,我说它是requires
一个返回的方法std::string
- 我可以以某种方式将其更改为说格式可以返回“任何能够的类型std::format()
”吗?
编辑:我已经知道std::formattable,但我能找到的唯一例子是如何确保模板类型T
本身是可格式化的 - 我仍然不知道如何指定关于其中一个T
函数的返回类型。
编辑:建议使用 std::formatter 给出:
test.cpp:10:26: error: wrong number of template arguments (1, should be 2)
10 | { v.format() } -> std::formattable;
| ^~~~~~~~~~~
In file included from test.cpp:5:
/usr/include/c++/14/format:2547:13: note: provided for ‘template<class _Tp, class _CharT> concept std::formattable’
2547 | concept formattable
| ^~~~~~~~~~~
示例代码:
#include <format>
#include <iostream>
template<typename T>
requires requires (T v) {
{ v.format() } -> std::convertible_to<std::string>;
}
struct std::formatter<T> : formatter<std::string>
{
auto format(T t, format_context& ctx) const
{
return formatter<std::string>::format(t.format(), ctx);
}
};
struct MyStruct
{
std::string format() const { return "I'm a struct"; }
};
int main()
{
MyStruct my_struct;
std::cout << std::format("outside: {}", my_struct) << std::endl;
}
C++20 概念的语法旨在测试其第一个参数。在
if
语句或requires
子句等 bool 转换上下文中,需要完整的参数列表。但是,当用作类型参数的约束、需求表达式中表达式的返回类型(OP 的情况)或简写模板参数时,第一个参数将被省略并替换为目标类型。其他参数不能省略,也不能有默认值。C++23有两个参数;第二个参数决定输出字符串/流的字符类型:concept std::formattable
对其他字符类型(如 utf8、utf16……)的泛化仍不完整,但该概念正在考虑未来的改进。