[英]Store pointer to function with variable number of arguments, in struct object
我正在尝试在结构中存储用户命令列表。 该结构由一个命令(char数组)和一个指向静态成员函数的指针组成,该成员函数可以具有任意数量的参数。 我希望能够实例化该结构,并将其存储在向量中,然后在访问它时调用存储的函数指针,并传入必要的参数。
经过大量阅读和实验之后,我得出了以下结论:
template<typename F, F func, typename... Args>
struct InputCommand
{
public:
char input[ 32 ];
void ( Interpreter::*func )( Args... args );
InputCommand( const char input[] )
{
strcpy( this->input, input );
}
};
上面的代码对我来说似乎是合理的逻辑,但是在尝试声明类型为InputCommand的向量时出现错误:
vector<InputCommand> m_commandList;
InputCommand<void *, cmdAddState, const char, const char> command( "addstate" );
m_commandList.push_back( command );
根据编译器的声明,声明需要一个命令列表,但是我真的不确定该怎么做。 仅供参考,函数cmdAddState如下:
static void Interpreter::cmdAddState( const char, const char );
任何帮助将不胜感激。 谢谢!
问题在于尝试持有通用类型的向量:
vector<InputCommand> m_commandList;
由于InputCommand
是模板,因此向量需要知道将存储哪种类型的InputCommand。
同样,如果不定义内部向量的类型,就不能拥有向量的向量:
vector<vector> cant_do;
但是您当然可以:
vector<vector<int>> fine;
因此,如果您要在vector<InputCommand>
InputCommand
的模板参数,则会进行编译。
但是,您想存储任何类型的InputCommand
(就像我们要在矢量中存储“所有类型的矢量”一样,不一定要存储ints的矢量)。
这可以通过使InputCommand
模板类具有基类(例如AbstractInputCommand
),并使向量保持指向该基类的指针,从而允许保持派生的指针来实现。 但是,当您调用实际的存储函数时,您会遇到问题,因为不同数量的参数不允许在基础上声明虚拟方法。
当然,还有使用std::function
的选项。 但是,使用std::function
不足以允许保存不同类型的std :: function。
最后,这带来了一个问题,不幸的是,在C ++中,模板方法(例如: template<typename... Args> void call()
不能是虚拟的。 这使得很难简单地调用您存储的实际函数。
也可以看看:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.