gpt4 book ai didi

GNU Readline 的 C++ 包装器

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

我正在尝试为 GNU Readline 编写一个 c++ 包装器,以便能够轻松地使用自定义完成,但遇到了一个小问题并且想不出解决方案(我还是 c++ 的新手)。

class ReadLine {

public:

ReadLine();
~ReadLine();

std::string exec ();
void enableHistory ();

private:
std::vector<std::string> keywordList;
bool history;

private:
static char** my_completion (const char*, int, int);
void* xmalloc (int);

char* generator (const char*, int);
char* dupstr (std::string);

};

cpp文件:

std::string ReadLine::exec(){

rl_attempted_completion_function = my_completion;

std::string buf = "";

buf = readline("Command>>");
//enable auto-complete
rl_bind_key('\t',rl_complete);

if (buf[0]!=0)
add_history(buf.c_str());

return buf;
}




char** ReadLine::my_completion (const char* text, int start, int end) {


char** matches;

matches = NULL;

if (start == 0)
matches = rl_completion_matches(text, my_generator);

return matches;


}

我的问题是线路

matches = rl_completion_matches(text, my_generator)

它显然会抛出一个错误:call to non-static member function without an object argument 但我不想让生成器成为静态的,而且我找不到它应该接受的参数,因为我将无法访问其中的类成员(我需要关键字列表来生成关键字)。

你有什么建议?

最佳答案

要以好的方式解决这个问题并不容易,因为正常的解决方案是通过使用静态包装函数来解决它,在该函数中将指针作为参数传递给类。

其他人可能会想出更好的办法,但我认为解决方案是拥有一个全局变量,该变量是指向当前 ReadLine 类实例的指针 - 这可能是一个堆栈,因此您可以压入一个新的放在上面,然后弹出它以在完成后返回到旧的。

在简单的情况下,您会得到这样的东西:

ReadLine *currenReadLine = 0;

....

std::string ReadLine::exec(){
...
currentReadLine = this;
}


// declared as static in the class.
char ** ReadLine::my_completion(...)
{
return currentReadLine->actual_completion(...);
}

my_generator 也有类似的解决方案。

关于GNU Readline 的 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18053626/

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