小编blu*_*gon的帖子

重载operator == for pods

我正在研究一些具有高级接口的低级代码,并且需要比较运算符来进行普通旧数据类型(如FILETIME struct)的单元测试,但由于C++甚至不提供成员比较,所以我写了这样的:

template <typename Type>
std::enable_if_t<std::is_pod<Type>::value, bool> operator==(const Type& a,
                                                            const Type& b) {
  return std::memcmp(&a, &b, sizeof(Type)) == 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这是一个好方法还是有一些隐藏的恶魔会让我在开发周期后期遇到麻烦,但它现在有点工作.

c++ memory templates memcmp template-meta-programming

9
推荐指数
1
解决办法
312
查看次数

对于GetLastError()== 0的当前路径,loadlibrary失败

我有一个简单的程序,从当前路径加载DLL

#include <iostream>
#include <windows.h>

using namespace std;

auto loaddll(const char * library) {
    auto dllModule = LoadLibrary(library);
    if(dllModule == NULL)
        throw "Can't load dll";     
    return dllModule;
}

int main() {
    try {   
        auto Handle = loaddll("ISab.dll");
    } catch(const char * error) {
        cerr << "An Unexpected error :" << error << endl;   
        cerr << "Get Last Error : " << GetLastError();
    }
}
Run Code Online (Sandbox Code Playgroud)

加载库对于当前路径中的每个DLL都会失败,但对于像User.dll这样的DLL会成功

如果我运行它输出将是

An Unexpected error :Can't load dll
Get Last Error : 0
Run Code Online (Sandbox Code Playgroud)

如果我指定dll的完整路径,这也会失败

c++ windows dll winapi

2
推荐指数
1
解决办法
1957
查看次数

在实现std :: vector时,我是否必须拥有end()的"end"指针?

假设我有自己的实现std::vector,它为迭代提供begin()end()函数.可能会发生size()== capacity()和返回的指针end()不归我所有.它是安全的还是我需要确保size()< capacity()

我知道这一难题可以通过使用自定义的迭代器类来克服,但在这里,我说的是,当简单的情况下,begin()简单地返回一个指向缓冲区的开始,并end()begin()+size().

c++ memory memory-management stdvector

2
推荐指数
1
解决办法
99
查看次数

从模板参数声明模板化类中的函数指针

我试图从函数原型的模板参数声明函数指针

template <typename ReturnType, typename... Args> class DllFunction {
public:
  ReturnType (*fptr_)(Args...);
};

DllFunction<int(int)> f;
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

错误:C2091:函数返回功能

c++ templates generic-programming variadic-templates c++17

2
推荐指数
1
解决办法
64
查看次数

为什么使用int64_t给出错误的结果,而double工作正如预期的简单整数乘法

这是我的代码:

using integer = int64_t;

integer factorial(integer number) {
    return number <= 0 ? 1 : number * factorial(number - 1);
}

integer binomial_coefficent(integer n, integer r) {
    return factorial(n) / (factorial(r) * factorial(n - r));
}

int main()
{
    using namespace std;
    cout << binomial_coefficent(40, 20) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印

0
Run Code Online (Sandbox Code Playgroud)

这是错误的答案,但如果我将整数类型更改为将打印1.37847e+11 哪个是正确答案,我的问题是为什么使用int64_t给我错误的答案

c++ double int factorial

0
推荐指数
3
解决办法
111
查看次数