1

我正在尝试使用

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

wheregetDataOrPointer应该返回一个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<T,char>检查它是否可以被fmt库格式化?我只希望在本地不总是这种后备。

4

1 回答 1

1

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

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

于 2021-01-26T13:48:37.990 回答