函数向量_指针有不同的原型,我可以构建一个吗
Vector of fuctions_pointers whit different prototype, can i build one?
我正在为一个类调用virtual_machine做parser,我试图为它构建一个函数向量,但vm上的一些函数接受参数(不同数量/类型的参数(,我仍然可以将它们放在我的函数向量中,因为它们只有void(*f(((;
这是代码
class Virtual_Machine {
public:
/***/
void clear();
void pop();
void clear();
void assert(std::string const &value);
void push(eOperandType const &e, std::string const &str);
/***/
}
class Parser {
public:
/***/
void prepare();
void add_func_no_arg(void (Virtual_Machine::*f)(), std::string comand);
private:
Virtual_Machine vm;
std::vector<std::string> command_no_arg;
std::vector<void (Virtual_Machine::*)()> func_no_arg;
/***/
};
void Parser::add_func_no_arg(void (Virtual_Machine::*f)(), std::string comand)
{
command_no_arg.push_back(comand);
func_no_arg.push_back(f);
}
void Parser::prepare()
{
add_func_no_arg(&Virtual_Machine::dump,"dump");
add_func_no_arg(&Virtual_Machine::pop,"pop");
add_func_no_arg(&Virtual_Machine::clear,"clear");
}
void Parser::use_exemple()
{
// dump :
(vm.*(func_no_arg[0]))();
}
这是可以的,但现在我将转到kwon,如果可以将push((和assert((添加到我的函数向量中,我需要做什么?我想也许是模板,但我真的不明白是怎么回事
Daniel Jour的广泛链接答案显示了如何通过打包和boost::any
来隐藏参数,这可能是一个更好的解决方案(但我并不完全理解(。作为替代方案,您可以使用变差函数,如下例所示。
请对我的代码持保留态度,我遇到了一些限制,我不是这个主题的专家:
- 您无法通过
...
接收引用类型参数 - 常量参数被提升为非常量参数(在我的测试中,
const int
被提升为int
( - 我认为变异函数是一种安全风险。如果函数参数是由用户提供的,请检查/清除输入
下面是代码示例(请注意,我将Virtual_Machine::assert
重命名为Virtual_Machine::vmassert
,以使用<cassert>
中的assert
(:
#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <cstdarg>
class Virtual_Machine
{
private:
std::string name;
public:
Virtual_Machine(std::string n) : name(n) {}
void clear(size_t nargs, ...){std::cout << "Clear " << name << std::endl;};
void dump(size_t nargs, ...){std::cout << "Dump" << std::endl;};
void vmassert(size_t nargs, ...)
{
va_list args;
va_start(args, nargs);
assert(nargs == 1);
const std::string value(va_arg(args, std::string));
std::cout << "Assert " << value << std:: endl;
va_end(args);
}
void push(size_t nargs, ...)
{
va_list args;
va_start(args, nargs);
assert(nargs == 2);
const int e(va_arg(args, int));
const std::string str(va_arg(args, std::string));
std::cout << "Push " << e << ", " << str << std:: endl;
va_end(args);
}
};
class Parser
{
private:
Virtual_Machine vm;
std::vector<std::string> commands;
std::vector<void (Virtual_Machine::*)(size_t, ...)> funcs;
public:
Parser(std::string vm_name) : vm(vm_name) {}
void add_func(
void (Virtual_Machine::* f)(size_t, ...),
std::string command)
{
commands.push_back(command);
funcs.push_back(f);
}
void prepare()
{
add_func(&Virtual_Machine::clear, "clear");
add_func(&Virtual_Machine::dump, "dump");
add_func(&Virtual_Machine::vmassert, "assert");
add_func(&Virtual_Machine::push, "push");
}
void test()
{
(vm.*(funcs[0]))(0);
(vm.*(funcs[1]))(0);
(vm.*(funcs[2]))(1, std::string("abc"));
(vm.*(funcs[3]))(2, 42, std::string("def"));
}
};
int main()
{
Parser a("vm_a");
a.prepare();
a.test();
return 0;
}
我将所有Virtual_Machine
成员函数的签名更改为(size_t nargs, ...)
,这样您就可以为所有可以用来声明Parser::funcs
的函数提供一个统一的类型。现在,每个函数都必须使用参数数量和实际参数进行调用。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- 我可以使用宏自动构建参数列表吗?
- 我可以在Embarcadero C 建造者中为Android(*.so)构建共享库
- 我是在构建正确的组织角色的方式,以便我可以计数它们
- 使用 Ninja 构建系统,我可以清理中间构建产品吗?
- 我可以用Visual Studio 2015为Windows嵌入式系统(WinCE 6.0,WES7)构建C++应用程序
- 我可以将使用v120_xp工具集构建的静态库链接到使用VS2013中的v120工具集创建的EXE/DLL中吗
- 我可以从命令行构建MFC应用程序吗
- 我可以用Boost 1.55构建一个双向协同程序吗
- cmake,我可以从可执行对象构建一个库吗?
- 一个简短的c++文件和makefile:我可以在shell中制作,但在Eclipse中构建它时会遇到很多错误
- 我可以用标准库组件构建这个特殊的舍入函数吗
- 我可以为脱机使用构建开源路由机器吗
- 使用 VS2010 的 msbuild 构建时,我可以从命令行设置平台工具集吗?
- 有人可以解释为什么我的 cmake 文件无法构建我的 cpp 文件
- 我可以使用字体表构建抽象访问者吗?
- 我可以使用 NDK 在安卓上构建命令行应用吗?
- 我可以在构建一个新的变量模板参数时使用一个变量模板参数吗
- 如何使用调试构建 libwebsockets(即 -g 以便我可以使用 gdb)?(我在libwebsockets函数上遇到段错误,ssl_ctrl() )