作为练习,我试图使用模板编写数组实现,但使用函数指针作为模板参数.每次对数组进行索引时都会调用此函数.
template<typename T, int size>
using Array_fnIndex = void (*)(int index);
template<typename T, int size, typename Array_fnIndex<T, size> fnIndex>
struct Array {
T data[size];
T& operator[](int index) {
fnIndex(index);
return data[index];
}
};
// example index function
template<typename T, int size>
void checkIndex(int index) {
assert(index < size);
}
int main() {
Array<int, 10, checkIndex<int, 10>> a; // this works
Array<int, 10, checkIndex<int, 11>> b; // this also works, not what I want
Array<int, 10, checkIndex> c; // this doesn't …Run Code Online (Sandbox Code Playgroud) 我aligned_malloc用C++ 编写了一个实现,主要使用下面的代码,可以在Interwebs的各个地方找到,包括SO:
void * aligned_malloc(size_t size, int align) {
if (align < 0) {
return NULL;
}
void *ptr;
void *p = malloc(size + align - 1 + sizeof(void*));
if (p != NULL) {
ptr = (void*) (((ptrdiff_t)p + sizeof(void*) + align -1) & ~(align-1));
*((void**)((ptrdiff_t)ptr - sizeof(void*))) = p;
return ptr;
}
return NULL;
}
void aligned_free(void *p) {
void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));
free(ptr);
return;
}
Run Code Online (Sandbox Code Playgroud)
我明白*(void**)了aligned_malloc.我的误会是与演员在一起aligned_free.因为我们只想要价值而不必分配它为什么不使用
void *ptr …Run Code Online (Sandbox Code Playgroud) 我正在使用SDL并遇到了一个我无法解决的问题.我想将纹理(指向struct的指针)保存在std::map我std::string用作键和std::unique_ptr<texture, void(*)(texture*)>值的位置.我必须使用删除器std::unique_ptr,因为纹理必须由某个函数释放.纹理也由另一个函数创建.我将代码简化为以下内容:
#include <map>
#include <memory>
int* new_int(){ return new int; }
void delete_int(int* p){ delete p; }
typedef std::unique_ptr<int, void(*)(int*)> int_ptr;
int main()
{
std::map<int, int_ptr> the_map;
the_map[1] = int_ptr(new_int(), delete_int);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在Visual Studio 2012中编译此代码时,我收到以下错误:
error C2338: unique_ptr constructed with null deleter pointer.
Run Code Online (Sandbox Code Playgroud)
我觉得奇怪,因为我提供delete_int了删除指针.欢迎任何帮助,不同的方法也是如此.提前致谢!