如何使用类型特征/概念检查类型是否为 'formattable'?
How to check that a type is 'formattable' using type traits / concepts?
我想检查一下某种类型是否可以与 std::format
一起使用。
这是我天真的尝试:
template<typename Object>
concept formattable = requires(const Object & obj)
{
std::format("{}", obj);
};
但这不起作用。它基本上 returns 对所有类型都是正确的。即使那些不能与 std::format.
一起使用的
static_assert(!formattable<std::vector<int>>); // should return false
为什么不起作用?
因为 std::format
不是约束函数,表达式 std::format("{}", obj)
总是 well-formed。你可能想做
#include <format>
template<typename T>
concept formattable = requires (T& v, std::format_context ctx) {
std::formatter<std::remove_cvref_t<T>>().format(v, ctx);
};
主要是基于basic_format_arg
的构造函数在[format.arg]中的约束。
我想检查一下某种类型是否可以与 std::format
一起使用。
这是我天真的尝试:
template<typename Object>
concept formattable = requires(const Object & obj)
{
std::format("{}", obj);
};
但这不起作用。它基本上 returns 对所有类型都是正确的。即使那些不能与 std::format.
一起使用的static_assert(!formattable<std::vector<int>>); // should return false
为什么不起作用?
因为 std::format
不是约束函数,表达式 std::format("{}", obj)
总是 well-formed。你可能想做
#include <format>
template<typename T>
concept formattable = requires (T& v, std::format_context ctx) {
std::formatter<std::remove_cvref_t<T>>().format(v, ctx);
};
主要是基于basic_format_arg
的构造函数在[format.arg]中的约束。