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

时间:2017-10-08 08:58:36

标签: c++ c++11 templates callback generic-programming

我正在尝试在结构中存储用户命令列表。该结构由一个命令(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 );

非常感谢任何帮助。 谢谢!

1 个答案:

答案 0 :(得分:0)

问题在于尝试持有泛型类型的向量:

vector<InputCommand> m_commandList;

由于InputCommand是模板,因此向量需要知道将存储哪种确切类型的InputCommand。

同样,如果不定义内部向量的类型,则不能有向量向量:

vector<vector> cant_do;

但你当然可以这样做:

vector<vector<int>> fine;

因此,如果您要在InputCommand中说明vector<InputCommand>的模板参数,则会编译。

但是,你想存储任何类型的InputCommand(就像我们想要存储在一个向量中的'各种向量',不一定是int的向量)。

这可以通过为InputCommand模板类(例如AbstractInputCommand)提供基类并使向量保持指向此基类的指针来实现,从而允许保存派生指针。但是当你来调用实际存储的函数时,你会遇到一个问题,因为不同数量的参数不允许在基础上声明一个虚方法。

当然也有使用std::function的选项。但是使用std::function不足以允许持有不同类型的std :: function。

最后,这就产生了一个问题,即在C ++中,模板方法,例如:template<typename... Args> void call()不能是虚拟的。这使得很难对您存储的实际函数进行简单调用。

可以在此找到问题的可能解决方案:

Storing and calling functions of different arguments in one function container

另见:

Container for pointers to member functions with different arguments