可以像'funs[1]();'一样调用的函数数组
Array of functions that can be called like 'funs[1]();'
我正在开发Visual C++2010学习版控制台应用程序。
在我详细介绍之前,这里的总结是:如何创建函数的数组/列表/向量,并从该数组中调用它们?
所以我在函数指针方面有点困难。我正在写一个"终端"类,它又有一个成员类"CommandMap"。CommandMap类的用途是将函数的矢量/数组以及表示它们的字符串存储在另一个矢量/数组中。我希望函数(仅)在类从向量调用它们时被调用,但它仅在我将其添加到向量时执行,而不是在尝试调用它时执行
我试着为它定义一种类型:
typedef void (*CmdCallback)();
我声明了一个包含它们的矢量:
vector<string> CmdNames;
vector<CmdCallback> CmdFuncs;
我这样添加它们:
// Map a new command
bool CommandMap::Map(string name, CmdCallback func)
{
if (!IsNullOrSpace(name) && func != NULL)
{
if (!Exists(name))
{
CmdNames.push_back(name);
CmdFuncs.push_back(func);
return true;
}
}
return false;
}
我试着这样称呼他们:
// Get a command callback from its identifier
CmdCallback CommandMap::GetFunc(string name)
{
int index = IndexOf(name);
if (index == -1) return NULL;
else return CmdFuncs.at(index);
}
// If the given string is a command indentifier
// it will invoke the associated callback.
bool CommandMap::Exec(string input)
{
for each (string id in CmdStrings)
{
if (input == id)
{
CmdCallback cmd;
cmd = GetFunc(id);
cmd();
return true;
}
}
return false;
}
我试过使用这个:
CmdCallback SayHello()
{
cout << "Hello World!" << endl;
return NULL; // Forces me to return null, guessing since it's
// not 'void' but a 'void' pointer it must return something
}
int main(int argc, char *argv[])
{
App = new Terminal(argc, argv);
App->Commands->Map("say", SayHello);
while (!App->ExecComplete)
{
App->WaitEnter();
App->Commands->Exec("say");
App->WaitEnter();
App->ExecComplete = true;
}
return App->ExitCode;
}
起初,这是有效的。不过,当我尝试Map()
时,会调用该函数。当我Exec()
"say"时,它会找到回调,但当它试图调用它时,我会得到这个运行时错误,除了中断或继续选项之外,我看不到其他细节。它给我的代码是。
我非常想放弃我的方法,尝试一种新的方法,也许我在void指针typedef上走错了路,我需要抛出一个"&"或者Map()
参数列表中我不喜欢的某个地方的'*'。也许矢量也不是最好的方法。
基本上,我在问如何创建一个函数数组,这些函数可以(并且只能)通过引用数组中的函数来调用。我很讨厌回电话。
您可以使用std::函数,或者,如果您没有C++11支持,可以使用boost::函数。这些是函数对象包装器,可以很容易地从自由函数或成员函数构建。您可以将这些存储在标准库容器或简单数组中。
如果我理解正确,您实际上想要将SayHello
声明为void SayHello()
,以便指向SayHello
的指针具有类型void (*)()
(即CmdCallback
),这是函数向量所需的类型。
- JavaScript箭头函数:我们能否像C ++ lambdas一样捕获值
- 函数返回动态强制转换的指针,返回指针,就好像它根本没有被转换一样
- 为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?
- 'inline'变量可以像内联函数一样内联吗?
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 将参数传递给成员函数,就像使用 std::cout 一样
- 如何创建像标准库头一样的头,以便在不链接头中函数的所有对象文件的情况下编译程序?
- 模拟一个函数,该函数像操作员=和破坏者一样传播到每个字段
- 可变参数函数并复制粘贴这些参数(就像我们在宏中一样)
- 如何像函数一样调用构造函数
- 我多么应该将空指针传递给c ++函数,就像C#中的IntPter.Zero一样
- 模板成员变量像通用函数一样键入
- 可以像'funs[1]();'一样调用的函数数组
- 如何在C++中像函数一样存储参数矩阵
- Java是否有默认的复制构造函数(就像C++中一样)
- 函数来像访问向量一样访问向量中结构的元素
- 如何像C++中的函数指针一样,但针对变量
- 像函数 strcmp 一样逐个比较字符
- 使用发出与调用信号,就好像它是Qt中的常规函数一样
- 在Fortran中更新两个数组,就像在这个C++函数中一样