有一定的自定义类型。我想检查代码是否已为其定义std::formatter,然后使用它将其转换为字符串,如果没有,则打印硬编码字符串。是否可以做到这一点(最好在编译时)?
struct A{};
if (there_is_formatter()) {
std::print("{}", A{});
} else {
std::print("no formatter");
}
有一定的自定义类型。我想检查代码是否已为其定义std::formatter,然后使用它将其转换为字符串,如果没有,则打印硬编码字符串。是否可以做到这一点(最好在编译时)?
struct A{};
if (there_is_formatter()) {
std::print("{}", A{});
} else {
std::print("no formatter");
}
主模板
std::formatter具有以下定义:这意味着,一旦您尝试调用
std::formatter<X>未定义专门化的默认构造函数,您就会收到编译错误。因此,您可以在此基础上进行构建:
请记住,要使此[检查]在编译时为您工作 - 类型推断必须工作,因此您不能在常规函数中编写它:)
例子
在 C++23 及更高版本中也是如此
if constexpr (std::formattable<A>)。在 C++20 中,它是这样的:(
if constexpr (std::default_initializable<std::formatter<X>>)这通常相当于std::is_default_constructible_v下一个答案)。