gpt4 book ai didi

c++ - 有没有办法抑制用户定义的类的 fmt 范围格式化程序?

转载 作者:行者123 更新时间:2023-12-04 11:28:47 24 4
gpt4 key购买 nike

我有一个简单的类,它有一个 tostring() 方法:

class MyClass {
public:

std::string tostring() const;

static iterator begin();
static iterator end();
};
虽然我现在正在使用 fmt 库,但这段代码是从没有的代码中移植过来的,所以许多遗留类都实现了 tostring() 方法,而且我有一个模板可以为任何类生成 fmt::formatter有那个方法它一直运行良好。
然而,这个特殊的类也有开始/结束功能。但是,它们是静态的(此类类似于枚举,您可以遍历所有可能的值),并且与格式无关。
一切都很好,直到我需要为一些不同的代码包含 fmt/ranges.h。问题是有一个范围格式化程序可以看到开始/结束函数并希望将类格式化为范围。现在,如果我尝试格式化类,我会得到格式化程序的一个模棱两可的实例(一个用于我要使用的模板,一个用于范围格式化程序)。
有没有办法让范围格式化程序忽略这个类?
一个完整的例子是:
#include <type_traits>
#include <utility>
#include <string>
#include <vector>
#include <fmt/format.h>
// #include <fmt/ranges.h>


// Create formatter for any class that has a tostring() method

template <typename T>
struct has_tostring_member {
private:
template <typename U>
static std::true_type test( decltype(&U::tostring) );
template <typename U>
static std::false_type test(...);
public:
using result = decltype(test<T>(0) );
static constexpr bool value = result::value;
};

template <typename T, typename Char>
struct fmt::formatter<T, Char,
std::enable_if_t<has_tostring_member<T>::value > >
: formatter<basic_string_view<Char>, Char> {
template <typename FormatContext>
auto
format( const T& e, FormatContext& ctx )
{
return formatter<string_view>::format( e.tostring(), ctx );
}
};


class MyClass
{
public:
explicit MyClass(int i) : value(i) {}

std::string tostring() const { return std::to_string(value); }

static auto begin() { return std::begin(static_data); }
static auto end() { return std::end(static_data); }

private:
int value;
static const std::vector<std::string> static_data;
};


const std::vector<std::string> MyClass::static_data{ "a", "b", "c" };

int main(void) {
MyClass c{10};

fmt::print("c is {}\n", c);

return 0;
}
如果我对 MyClass 有完整的 fmt::formatter 特化,那么没有歧义,但是如果我像在示例中那样使用部分特化,那么取消注释“#include ”将导致模棱两可的模板实例化。

最佳答案

以下是选项(您已经发现):

  • 不包括 fmt/ranges.h .
  • 提供全专业formatter .

  • 请注意,如果您为所有具有 tostring 的类型实现了通用格式化程序。您可以在一行中完成(2)( https://godbolt.org/z/cW3WzaP6f ):
    template <> struct fmt::formatter<MyClass> : tostring_formatter<MyClass> {};

    关于c++ - 有没有办法抑制用户定义的类的 fmt 范围格式化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67197633/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com