小编tot*_*oad的帖子

C++模板参数推断

作为练习,我试图使用模板编写数组实现,但使用函数指针作为模板参数.每次对数组进行索引时都会调用此函数.

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)

c++ templates

7
推荐指数
1
解决办法
238
查看次数

void*和*(void**)之间有什么区别?

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)

c++ pointers

5
推荐指数
1
解决办法
423
查看次数

为什么我不能用删除器创建这个unique_ptr?

我正在使用SDL并遇到了一个我无法解决的问题.我想将纹理(指向struct的指针)保存在std::mapstd::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了删除指针.欢迎任何帮助,不同的方法也是如此.提前致谢!

c++ unique-ptr

3
推荐指数
1
解决办法
1159
查看次数

标签 统计

c++ ×3

pointers ×1

templates ×1

unique-ptr ×1