如何使用类型特征/概念检查类型是否“可格式化”?

问题描述 投票:0回答:1

我想检查某种类型是否可以与

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 

为什么不起作用?

c++ c++20 typetraits c++-concepts
1个回答
9
投票

更新:

随着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构造函数的约束。

演示

© www.soinside.com 2019 - 2024. All rights reserved.