首页 > 解决方案 > C++:不同类型的容器

问题描述

我有一些具有不同参数的函数(对于这个例子来说很简单):

int addNums(int a, int b) {
    return a + b;
}

int squareNum(int a) {
    return a * a;
}

我有一个模板类action,它有一个函数指针,最终将指向上述任一函数:

template<class T>
class action {
public:
    std::string descriptionOfAction;
    T functionPtr;
};

我有一个类user,它应该有某种形式的actions 容器:

class user {
public:
    std::string name;

    //container of actions
};

main中,我定义并初始化了两个actions 来对应上面列出的前两个函数:

action<int(*)(int, int)> addAction;
addAction.descriptionOfAction = "Add two numbers together";
addAction.functionPtr = addNums;

action<int(*)(int)> squareAction;
squareAction.descriptionOfAction = "Square a number";
squareAction.functionPtr = squareNum;

现在我想将这两个actions 插入到 s 的users 容器中action

user aUser;
aUser.name = "User's Name";
//insert "addAction" and "squareAction" to user's container of actions

由于模板,这些actions 不是相同的类型。是否有现有类型的容器来容纳这些?如果没有,有没有办法在没有模板的情况下做类似的事情?理想情况下,当一个user“使用”action其容器中的 s 之一时,action应该将其删除。

标签: c++templatescontainersfunction-pointers

解决方案


这里的问题是函数有不同的数量(即参数的数量)。

将函数放入某个容器中并不是什么大问题。你总是可以把你的函数放入一个std::vector<void*>(编译器不在乎),但是……什么?有什么计划?

您还需要将函数 arity 添加到同一个容器,因此它转换为std::vector<std::pair<void*, unsigned int>>(函数指针 + arity)。这会自动使您的操作添加复杂化,因为您显然不想手动指定 arity,并且您需要自动执行此操作以避免任何人为错误。这涉及模板。此外,您将需要手动检查参数并传递适当数量的参数。这也容易出错。

最简单的方法是定义一些

struct my_function_interface {
    virtual int operator()(<all your parameters here>) = 0;
};

然后根据该界面定义您的操作。这是一个经典的 OOP 解决方案,可以抽象出你所有的问题。此外,它很可能会更高效,因为您的所有检查和特殊功能调用都不会免费提供。在这里,您将有一个虚拟函数调用。


推荐阅读