如何使用类型特征/概念检查类型是否为 '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]中的约束。

Demo