簡體   English   中英

c++ 向量的 function 與模板 arguments

[英]c++ vector of function with template arguments

#include<iostream>
#include<functional>
#include <unordered_set>
#include <vector>
#include <unordered_map>
#include <variant>




class Button
{
public:
    Button(int _val):val(_val){}
    ~Button();
    int val;
    
    template<typename F, typename...InArgs>
    void addListener(std::function<F(InArgs...)>(f), InArgs... args) {
        listener.push_back(f(args...));
    }

    template<typename F, typename...InArgs>
    void callMethod(std::function<F(InArgs...)>(f), InArgs... args) {
        f(args...);
    }
    
    void print() { std::cout << "Button value -> " << val << std::endl; }
private:
    template<typename F,typename...InArgs>
    static std::vector<std::function<F(InArgs...)>> listener;
    
};

inline void test1() {
    std::cout << "Printing test1 method...\n";
}
inline void test2(Button* b) {
    std::cout << "Button value is 20.\n";
    b->val = 20;
}
inline void test3(Button* b, int a) {
    std::cout << "Button value is passed parameter.\n";
    b->val = a;
}
inline void test4(int a) {
    std::cout << "print " << a << std::endl;
}
class AppThree
{
public:
    static void run() {
        Button* button = new Button(5);
        button->print();
        //button->callMethod(std::function<void(int)>(&test4), 1); //work it
        button->addListener(std::function<void(int)>(&test4),1); // error
        

    }
};

我想要將帶有 arguments 的函數推送到向量。 我想從向量中調用所有函數,但我無法添加函數。 我收到 C3245 錯誤。 我不知道哪里失敗了。 如果我的想法不正確,請展示真實的方式。 對不起我的英語不好:D

您有一個成員變量模板偵聽器,這意味着您對於每個 function 類型都有一個向量。 編譯器無法推斷出你的意思。
您還試圖push_back調用 function 而不是 function 本身的結果,並且您沒有存儲 arguments。

您不能按照您計划的方式執行此操作,因為listener不是一個具有不同類型元素的變量——它(可能)是許多變量,每個變量都有不同的類型。
為了調用它們,您需要枚舉變量實例化,這是不可能的。
此外,您還需要想辦法存儲 arguments。

由於以后要通過arguments,所以只需要一種類型,就可以在lambda中捕獲它們:

class Button
{
public:
    Button(int _val):val(_val){}
    ~Button();
    int val;
    
    template<typename F, typename...InArgs>
    void addListener(std::function<F(InArgs...)> f, InArgs... args) {
        listener.push_back([=]() { f(args...); });
    }
    void action()
    {
        for (auto& f: listener)
            f();
    }
    void print() { std::cout << "Button value -> " << val << std::endl; }
    
private:
    static std::vector<std::function<void()>> listener;
    
};

std::vector<std::function<void()>> Button::listener;

void test3(Button* b) {
    
    std::cout << "listened:";
    b->print();
}

void test4(int a) {
    
    std::cout << "print " << a << std::endl;
}

int main()
{
    Button* button = new Button(5);
    button->print();
    button->addListener(std::function<decltype(test4)>(&test4), 1);
    button->addListener(std::function<decltype(test3)>(&test3), button);
    button->action();
}

您還可以將偵聽器構造完全留給用戶:

class Button
{
public:
    Button(int _val):val(_val){}
    ~Button();
    int val;
    
    void addListener(std::function<void()> f) {
        listener.push_back(f);
    }
    void action()
    {
        for (auto& f: listener)
            f();
    }
    void print() { std::cout << "Button value -> " << val << std::endl; }
    
private:
    static std::vector<std::function<void()>> listener;
    
};

std::vector<std::function<void()>> Button::listener;

void test3(Button* b) {
    
    std::cout << "listened:";
    b->print();
}

void test4(int a) {
    
    std::cout << "print " << a << std::endl;
}

int main()
{
    Button* button = new Button(5);
    button->print();
    button->addListener([]() { test4(1); });
    button->addListener([button]() { test3(button); });
    button->action();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM