繁体   English   中英

在结构对象中存储指向具有可变数量参数的函数的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM