gpt4 book ai didi

c++ - C 中的模板在 C++ 中使用 void *

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:46 24 4
gpt4 key购买 nike

我有一个用 C++ 编写的通用类,作为练习,我一直在尝试将它移植到 C。我尝试过对特定类型使用 typedef,但意识到这可能是错误的方法。我正在尝试使用 void 指针,但我意识到我无法实例化泛型类是我缺少的东西吗?

ctrie.h

#ifndef _COM_WORDGAME_UTILITY_TRIE_H_KYLE
#define _COM_WORDGAME_UTILITY_TRIE_H_KYLE
#ifdef __cplusplus
extern "C"{ //this is used to identify following code as C specific code which will enforce C style name mangling
#endif


typedef struct Trie Trie;

//Create new Trie Object
Trie* newTrie(void * defVal);
//return number of key-value pairs
int size(Trie * t);
//return default value set by user
void * getDefaultValue(Trie * t);
//Check if returned value is not equal to default value
bool contains(Trie * t,const char * key);
//Return Value
void * get(Trie * t,char * key);
//Insert String into symbol Table
void put(Trie * t,char * s,void * val);
//Find and return longest prefix of s in TST
char * longestPrefix(Trie * t,char * s);
//compress the table making it immutable returning the number of nodes removed
int compress(Trie * t);

#ifdef __cplusplus
#include "cTrie.cpp"//quick hack to add cTrie without linking
}
#endif
#endif

ctrie.cpp

#include "Trie.hpp" //C++ code
#include "Trie.h" //C code

extern "C"{
using namespace com::wordgame::utility::trie;

//Create new Trie Object
Trie* newTrie(void * defVal){
return new Trie<typeid(defVal)>(defVal);
};
//return number of key-value pairs
int size(Trie * t){}
//return default value set by user
void * getDefaultValue(Trie * t){}
//Check if returned value is not equal to default value
bool contains(Trie * t,const char * key){}
//Return Value
void * get(Trie * t,char * key){}
//Insert String into symbol Table
void put(Trie * t,char * s,void * val){}
//Find and return longest prefix of s in TST
char * longestPrefix(Trie * t,char * s){}
//compress the table making it immutable returning the number of nodes removed
int compress(Trie * t){}


}

最佳答案

C++ 中模板化容器类型的一个关键优势是能够提供一种很好的语法方式将相关对象嵌入到结构本身中,例如典型的 std::vector<T> (通常作为简单数组实现)可以具有 T步幅 .要在 C 中完成这样的事情,您需要将整个函数实现为一堆宏,然后“实例化”为每种类型设置的函数,例如,C 中的简单“vector ”实现可能如下所示(这取决于你问谁)

#define VECTORFUNCS(T) \
typedef struct { \
T* arr; \
size_t narr; \
size_t capacity; \
} VECTOROF_##T; \
\
void vector_##T##_reserve(VECTOROF_##T *v, size_t n) { \
// \
} \
const T* vector_##T##_at(VECTOROF_##T *v, size_t ix) { \
return v->arr[ix]; \
} \

VECTORFUNCS(int)
VECTORFUNCS(struct sockaddr)

//等等

作为旁注,这也可以通过简单地传递 sizeof(T) 来更“干净地”实现(取决于你问谁)并为任何实现使用一组功能;这些函数需要处理 arr元素作为 char*并正确确定各种操作的偏移量)。

但是,如果您的模板类所做的只是附加一个指向 T 的指针为了类型安全,您可以完全在 C 中完成此操作而没有太多麻烦,当然您不必每次都“实例化”模板(并且也不是必需的。C 使从 void 进行转换变得不那么烦人)。

关于c++ - C 中的模板在 C++ 中使用 void *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com