我正在尝试在结构中存储用户命令列表。该结构由一个命令(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 );
非常感谢任何帮助。 谢谢!
答案 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