【发布时间】:2014-08-10 15:53:29
【问题描述】:
我有一个用 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){}
}
【问题讨论】:
-
TL;DR; 您可以在 c 中尝试的所有方法都是根据约定的假设进行转换!我非常怀疑您是否可以使用 c 重现类似的东西,例如 c++ 模板,但是使用笨拙且可能容易出错的宏实现!
-
包含双下划线或以下划线开头后跟大写字母的名称保留到实现(即编译器)以供任何使用。使用像
_COM_WORDGAME_UTILITY_TRIE_H_KYLE这样的名字是个坏主意。
标签: c++ c templates generics void-pointers