c++ - 如何使用具有不同模板参数的变量制作 vector ?

标签 c++ function pointers vector function-pointers

我正在制作一个程序,所有按钮都需要在一个 vector 中,这样我就可以使用 for 循环轻松地为所有按钮调用渲染函数。我创建了我的问题的简化版本。所以下面的代码有一个名为 Button 的类。当我创建一个 Button 变量时,我必须发送包含我想要调用的函数的类和模板中的函数指针。当我调用按钮 Pressed 函数时,它将调用我发送的函数。当我调用按钮渲染函数时,它将渲染。然后我有两个不同的类,它们具有在按下相应按钮时应调用的函数。我之前没有使用过模板,所以我不确定如果按钮具有不同的模板参数,我将如何将按钮放入 vector 中,所以我不能写:

for (int i = 0; i < buttons.size(); i++) {
    buttons[i].Render();
}

代替:

    button1.Render();
    button2.Render();
    button3.Render();
    but...

对了,下面是代码:

template<class CWF> //CWF = Class with Function
class Button {
public:
    typedef void(CWF::*eventMethod)();

    Button(CWF& cwf_, eventMethod method_) : method(method_), cwf(cwf_) {};
    ~Button() {}

    void Pressed() {
    (cwf.*(method))();
    }

    void Render() {};

private:
    eventMethod method;
    CWF& cwf;
};

Class1 class1;
Class2 class2;
Button<Class1> button1 = Button<Class1>(class1,&Class1::MyButtonWasPressed);
Button<Class2> button2 = Button<Class2>(class2, &Class2::MyButtonWasPressed);

int main() {

    // loop here
    button1.Render();
    button2.Render();
    //      

    //exiting herer
    string line;
    getline(cin, line);
    return 0;

}

最佳答案

在您的示例中,最好的选择是完全删除模板,而是将 std::function 与您的回调一起传递。

但是,如果您的需求足够复杂以至于这不可行,您将需要实现某种形式的类型删除。最直观的方法是让您的模板类派生自某个提供您需要的功能的接口(interface):

class AbstractButton {
public:
    virtual void Pressed() = 0;
    virtual void Render() const = 0;
};

template <typename CWF>
class Button : AbstractButton {
public:
    // ...
    void Pressed() override { /* ... */ }
    void Render() const override { /* ... */ }
};

使用:

// store in vector
std::vector<std::unique_ptr<AbstractButton>> buttons;
buttons.push_back(std::unique_ptr<AbstractButton>(new Button<Class1>(/* ... */)));
    // (or std::make_unique if you have C++14)

// use:
buttons[i]->Render();

关于c++ - 如何使用具有不同模板参数的变量制作 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38160241/

相关文章:

c - 结构..有人能弄清楚吗?

c++ - `QTreeView` 什么时候在 Mac 上发出激活信号?

c++ - 如何在json文件中搜索对象的值?

c# - 自动从 XML 模式创建 GUI

javascript - 使用 intro.js 在步骤中触发函数

c++ - boost 函数签名

C++ 在函数中转换指针

c# - 读取内存内存映射文件 C++ 和 C#

function - 如何在zsh中使用带有功能的 watch ?

C++(11) 函数的默认参数作为模板参数或函数指针