我正在研究一些具有高级接口的低级代码,并且需要比较运算符来进行普通旧数据类型(如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)
所以我的问题是,这是一个好方法还是有一些隐藏的恶魔会让我在开发周期后期遇到麻烦,但它现在有点工作.
我有一个简单的程序,从当前路径加载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的完整路径,这也会失败
假设我有自己的实现std::vector,它为迭代提供begin()和end()函数.可能会发生size()== capacity()和返回的指针end()不归我所有.它是安全的还是我需要确保size()< capacity()?
我知道这一难题可以通过使用自定义的迭代器类来克服,但在这里,我说的是,当简单的情况下,begin()简单地返回一个指向缓冲区的开始,并end()到begin()+size().
我试图从函数原型的模板参数声明函数指针
template <typename ReturnType, typename... Args> class DllFunction {
public:
ReturnType (*fptr_)(Args...);
};
DllFunction<int(int)> f;
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
错误:C2091:函数返回功能
这是我的代码:
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给我错误的答案