我想检查某种类型是否可以与
std::format
一起使用。
这是我天真的尝试:
template<typename Object>
concept formattable = requires(const Object & obj)
{
std::format("{}", obj);
};
但这不起作用。它基本上对所有类型都返回 true。即使那些不能与 std::format 一起使用的。
static_assert(!formattable<std::vector<int>>); // should return false
为什么不起作用?
随着Formatting Ranges的引入,C++23中已经有了一个专门用于测试类型是否可格式化的概念,即
std::formattable
。
由于
std::format
不是约束函数,因此表达式 std::format("{}", obj)
始终是格式良好的。你可能想做
#include <format>
template<typename T>
concept formattable = requires (T& v, std::format_context ctx) {
std::formatter<std::remove_cvref_t<T>>().format(v, ctx);
};
主要基于
[format.arg]中
basic_format_arg
构造函数的约束。