小编jpo*_*o38的帖子

使用接口作为共享指针参数

如何将派生自接口的类传递给以接口为参数的函数?

我有一个接口和一个类设置类似这样的东西。

class Interface
{
public:
    virtual ~Interface() {}
    virtual void DoStuff() = 0;
};

class MyClass : public Interface
{
public:
    MyClass();
    ~MyClass();
    void DoStuff() override;
};

void TakeAnInterface(std::shared_ptr<Interface> interface);

int main()
{
    auto myInterface = std::make_shared<MyClass>();
    TakeAnInterface(myInterface);
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨No matching function call to TakeAnInterface(std::shared_ptr<MyClass>&)。为什么功能TakeAnInterface不能接收Interface类而不是MyClass?

c++ interface

0
推荐指数
1
解决办法
2458
查看次数

为什么在写=而不是==时没有收到警告?

在几个小时内挣扎,最终确定由于此无效声明而导致的错误:

...
assert( variable = -0.5 );
Run Code Online (Sandbox Code Playgroud)

这显然应该是assert( variable == -0.5 );:开发者错字.

我正在使用Visual Studio 2015进行编译,并且确实在进行"0警告编译".

怎么可能编译这样一个糟糕而危险的语句而编译器没有报告任何警告?是否没有编译器选项我们可以启用以避免这种情况?

编辑:甚至bool b = ( variable = -0.5 )不会产生任何编译器警告

c++ visual-c++ visual-studio-2015

0
推荐指数
1
解决办法
213
查看次数

难以编码的双重最低有效字节是一个好的舍入策略吗?

我有一个函数做一些数学计算并返回一个double.由于std::exp实现方式不同,它在Windows和Android下会得到不同的结果(为什么我得到std :: exp的特定于平台的结果?).e-17舍入差异得到了传播,最终它不仅仅是我得到的舍入差异(结果最终可以改变2.36到2.47).当我将结果与某些预期值进行比较时,我希望此函数在所有平台上返回相同的结果.

所以我需要围绕我的结果.这样做的最简单的解决方案显然是(据我在网上找到)std::ceil(d*std::pow<double>(10,precision))/std::pow<double>(10,precision).但是,根据平台的不同,我觉得这仍然会得到不同的结果(此外,很难确定precision应该是什么).

我想知道是否硬编码最不重要的字节double可能是一个很好的舍入策略.

这个快速测试似乎表明"是":

#include <iostream>
#include <iomanip>

double roundByCast( double d )
{
    double rounded = d;
    unsigned char* temp = (unsigned char*) &rounded;
    // changing least significant byte to be always the same
    temp[0] = 128;
    return rounded;
}

void showRoundInfo( double d, double rounded )
{
    double diff = std::abs(d-rounded);
    std::cout << "cast: " << d << " rounded to " << rounded …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point precision rounding

0
推荐指数
1
解决办法
100
查看次数

C++ chrono 将微秒精度的字符串转换为 chrono 对象

我正在解析 SVN 日志,它们包含这种格式的日期/时间2023-09-23T23:08:30.383815Z

我需要将其转换为时间对象(应该std::chrono::steady_clock是好的格式)。然而,我能找到的所有代码都使用没有微秒精度的 std::tm :

std::tm t = {};
std::istringstream ss("2023-09-23T23:12:34Z");
ss >> std::get_time(&t, "%Y-%m-%dT%H:%M:%SZ");

if (ss.fail())
    std::cout << "Parse failed\n";
else
    std::cout << std::put_time(&t, "%c") << '\n';
Run Code Online (Sandbox Code Playgroud)

应该使用什么函数将这样的字符串转换为任何std::chrono保留微秒信息的对象?

注意:我没有使用 C++20,因此将微秒精度的字符串转换为 chrono time_pointCan std::chrono::from_stream 将微秒精度的字符串转换为 time_point 吗?不是重复的。

c++ c++-chrono c++17

0
推荐指数
1
解决办法
107
查看次数