代码之家  ›  专栏  ›  技术社区  ›  Araeos

{fmt}中基于特征的定制点和ODR冲突关注点

  •  2
  • Araeos  · 技术社区  · 7 年前

    fmt::formatter .

    编译器资源管理器中的代码: https://godbolt.org/z/2VO_wa

    A 和 B ,它们在实现中都大量使用fmt,并且都以某种方式需要打印/记录当前时间。 两者都可以合理使用 std::chrono::system_clock fmt::formatter<std::chrono::system_clock::time_point> 为了使这个简单的代码成为可能:

    auto msg = fmt::format("It is now {}", std::chrono::system_clock::now());
    

    图书馆 A. 使用不同于 B ,因为它考虑了本地时区,而不是以UTC打印。

    现在这个例子非常具体,但是由于类模板 是格式化用户提供的类型的方法,这种情况可能以某种形式出现。

    问题

    C 使用两个(不相关的)库 和 然后我相信会有两个相同类型的不同实现(即 )从而以未定义的行为违反了ODR。

    问题

    假设我正确理解情况,我的两个问题是:

    1. 在应用程序中有没有避免这种冲突的方法 不改变 B 上游?
    2. 如果其中一个 A. 或 B (或两者)可以修改,以何种方式可以解决或完全防止冲突。
    1 回复  |  直到 6 年前
        1
  •  4
  •   Jarod42    7 年前

    你确实违反了ODR,我认为你不能避免冲突而不改变A和/或B。

    1. 如果A或B(或两者)都可以修改,那么可以通过什么方式解决或完全防止冲突。

    只指定您自己的库的类型: std::chrono::system_clock::time_point

     namespace A {
         struct TimePoint {
             std::chrono::system_clock::time_point timePoint;
         };
     }
    
    
    namespace fmt {
         // Specialization of formatter<TimePoint>
    }
    

    auto msg = fmt::format("It is now {}", A::TimePoint{std::chrono::system_clock::now()});
    

    图书馆B也一样。