【问题标题】:How to make a vector with variables that have different template parameters?如何使用具有不同模板参数的变量制作向量?
【发布时间】:2016-07-02 12:38:48
【问题描述】:

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

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;

}

【问题讨论】:

  • 仅仅为了在几乎不相关的类中调用函数而使用模板参数是没有意义的。只需去掉模板参数,以便所有按钮都是同一个类,因此可以与向量一起使用,并让 Button 将 std::function 作为单击事件的回调并完成它。除非你真的需要,否则不要使用全局变量。
  • 你知道学习 std::function 的好资源吗?我以前从未见过。
  • 我已经解决了我的问题。非常比你。

标签: c++ function pointers vector function-pointers


【解决方案1】:

您示例中的最佳选择是完全删除模板,而是在回调中传递std::function

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

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();

【讨论】:

  • 按钮构造函数现在包含 std::function 作为保存到变量的参数。当按钮按下函数被调用时,它会调用这个函数。
  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2022-01-19
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多