【问题标题】:Formatting type by fallback to pointer with fmt library通过回退到使用 fmt 库的指针来格式化类型
【发布时间】:2021-01-25 15:05:58
【问题描述】:

我正在尝试使用

fmt::format("Expected : '{}' vs. '{}'", getDataOrPointer(rA), getDataOrPointer(rB));

其中getDataOrPointer 应该返回一个void 指针(它总是可以被格式化)或者当存在格式化程序时的默认值:

//! Return the type if a `fmt::formatter` exists.
template<typename T,
         typename std::enable_if_t<hasFormatter<std::decay<T>, char>>* = 0>
decltype(auto) getDataOrPointer(const T& rData)
{
    return rData;
}

//! Return a void-Pointer if no `fmt::formatter` exists.
template<typename T,
         typename std::enable_if_t<!hasFormatter<std::decay<T>, char>>* = 0>
const void* getDataOrPointer(const T& rData)
{
    return static_cast<const void*>(&rData);
}

我不知道怎么写:hasFormatter&lt;T,char&gt; 来检查它是否可以被fmt 库格式化?我只希望在本地不总是这样的后备。

【问题讨论】:

    标签: c++ c++14 fmt


    【解决方案1】:

    你可以使用fmt::has_formatter,引用https://github.com/fmtlib/fmt/issues/1369

    has_formatter&lt;T, Context&gt; 告诉你 T 类型有一个 formatter 特化 Context (上下文基本上指定字符和输出迭代器类型),它可以与 SFINAE 一起使用。示例:https://godbolt.org/z/pCD14x。主要需要注意的是,具有隐式转换的类型可以是可格式化的,但没有 formatter 特化。

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多