C++ 避免在收割台中包含chrono

C++ 避免在收割台中包含chrono,c++,c++11,C++,C++11,我正在使用std::chrono来跟踪从实例化到每次调用someMethod()所经过的时间 最简单的示例代码如下所示: #include <chrono> class TestClass { public: TestClass(); void someMethod(); private: std::chrono::time_point<std::chrono::steady_clock> m_timeBegin; }; #包括 类TestC

我正在使用
std::chrono
来跟踪从实例化到每次调用
someMethod()
所经过的时间

最简单的示例代码如下所示:

#include <chrono>

class TestClass
{
public:
    TestClass();
    void someMethod();

private:
    std::chrono::time_point<std::chrono::steady_clock> m_timeBegin;
};
#包括
类TestClass
{
公众:
TestClass();
无效方法();
私人:
std::chrono::time_point m_timeBegin;
};

TestClass::TestClass():
m_timeBegin(std::chrono::staid_clock::now())
{
}
void TestClass::someMethod()
{
auto timeNow=std::chrono::STARDY_clock::now();
自动创建=
std::chrono::duration_cast(timeNow-m_timeBegin);
}
我想去掉标题中的
#include

动机 除了编译和链接时间,我主要关心的是封装。使用
std:chrono
仅与实现相关。为了使用
Testclass
,绝对不需要使用它,甚至不需要知道它涉及到什么

下面是一些可能的情况。如果使用
TestClass
的用户决定使用
std::chrono
,则无需添加
#include
。然后,如果将来
TestClass
的实现使用
std:chrono
更改停止(并因此删除
#include
),则其他代码将无理由停止编译

很明显,那个忘了添加include的家伙做错了。但很明显,无论我们喜欢与否,这种情况都会发生

附加信息
由于它可能与某些解决方案相关,因此经常调用
SomeMethod()
,在我的场景中,性能非常重要。

如果
时间点
是自定义类型,您的问题将得到解决,因为这样您就可以向前声明它,将成员更改为(唯一)指针,并将include移到.cpp文件中。但是,
std
类型的前向声明是未定义的行为,因此这是不可能的。这基本上为您提供了以下选项:

  • 在自定义类中包装
    std::chrono::time\u点。然后可以安全地向前声明该类型,将成员更改为(唯一)指针,并将自定义类的include(包括
    )移动到.cpp文件中
  • 使用该习惯用法并将类的整个实现移动到.cpp文件中
我理解你的动机。尽管如此,尽管你的场景中有人使用了
却忘记了包含它并不牵强,但这是那个人的问题,而不是你的问题。因此,您应该考虑是否真的有必要引入一些复杂性,只是为了隐藏
标题。标准库包括通常不会造成伤害,特别是因为它们不会引入重建影响


正如其他人所指出的,为pimpl习惯用法或前向声明类型使用智能指针将引入另一个include,即
。尽管这通常是比
更常见的标题,但您只是将一个包含替换为另一个包含。因此,如果您真的想避免额外的包含,您可能需要使用原始指针。但是,您还必须处理其他问题,例如复制和移动操作。

我想,您可以使用隐藏这个特定的实现细节,尽管它会带来每个方法调用额外指针访问的成本。然而,我相信你在
#include
上做得太大了:添加这个指令对于客户端代码来说并不是一个很难解决的问题,在不太可能的情况下,你的类会停止依赖它,并且所述客户端代码的作者出于某种原因决定依赖你的头来为chrono提供include(顺便说一句,这对他们来说是一种错误)。可能的重复如果您对想要度量的函数进行了单元测试,您可以使用
https://github.com/google/benchmark
。因此,使用
chrono
一点问题都没有。“缺少的包括”问题不局限于你的代码。包括任何标准库头可能已经间接地包括任何其他标准库头。哪些从编译器到编译器,从一个标准库到下一个版本都不同。你不会使这更糟。恐怕你在二十年前就失去了这一点。不像C,C++是H。pimpl习惯用法通常会使用智能指针,因此另一个包含如
..@Jarod42“你是对的,”我在回答中添加了这个注释。
TestClass::TestClass() :
    m_timeBegin(std::chrono::steady_clock::now())
{
}

void TestClass::someMethod()
{
    auto timeNow = std::chrono::steady_clock::now();
    auto msSinceCreation = 
         std::chrono::duration_cast<std::chrono::milliseconds>(timeNow - m_timeBegin);
}