如何将可变参数传递给虚函数

时间:2017-01-30 10:05:37

标签: c++ std-function variadic-functions

我有一个工作虚拟函数add,它使用以下设置:

using Func = std::function<std::vector<unsigned char>()>;      

class cfExecutor {
public:
    cfExecutor();
    virtual ~cfExecutor();
    /// Enqueue a function to be executed by this executor. This and all                     
    /// variants must be threadsafe.
    virtual void add(Func) = 0;                              
    virtual void add(std::vector<Variant> params, Func callback) = 0; 
};


class ManualExecutor : public cfExecutor                                                                            
{                                                                                                                   

    std::mutex lock_;             // avoid multiple entity updating the function container                          
    std::queue<Func> funcs_;      // functions queued for running                                                 

    public:                                                                                                         
    std::map<int8_t, Func> funcs; // Function container (priority,Func) - added functions to this Executors       

    ManualExecutor() {}                                                                                             
    ManualExecutor(ManualExecutor&& other):                                                                         
                    funcs(std::move(other.funcs))                                                                   
    {}                                                                                                              
    ~ManualExecutor() {}                                                                                            

    void add(Func callback);                                                                          
    void add(std::vector<Variant> params, Func callback);                     
};                                                                                                                  

然后我想在函数中添加可变参数 - 就像这样:

using Func = std::function<std::vector<unsigned char>(const auto&...args)>;  

但是我得到了隐式错误[隐式模板可能不是'虚拟']

如何使用可变参数params定义add函数?

到目前为止,我已经使用以下方法解决了这个问题:

using Func = std::function<std::vector<unsigned char>(std::vector<Variant>)>;

然后让lambda函数处理向量内部的接收args - 如下所示:

auto lambdaFunction = [](std::vector<Variant> vec){        

    std::vector<unsigned char> result;                     
    cout << "- Hello from executor - lambdaFunction ";     
    std::cout << ": parameters : ";                        
    for(auto a: vec) {                                     
        std::cout << a << ",";                             
    }                                                      
    std::cout << std::endl;                                 

    std::string s("this is the result");                   
    result.insert(result.end(),s.begin(), s.end());        
    return result;                                         
};        

2 个答案:

答案 0 :(得分:2)

AFAIK,你不能在函数原型中使用'auto'

您可能想要执行以下操作:

template<typename ... Args >
using Func =std::function<std::vector<unsigned char>(const Args&...args)>;

template<typename ... Args >
class cfExecutor {                        
 public:   
     cfExecutor();                        
    virtual ~cfExecutor(); 
     virtual void add(Func<Args...>) = 0;

    };

答案 1 :(得分:2)

看起来你想传递一个绑定函数。

可以使用std::bind完成此操作。您无需以任何方式更改add或添加基于vector<variant>的重载。只需按以下方式调用:

std::vector<unsigned char> myfunction (int, const char*, Foo&);

...
int i = 123;
const char* s = "abc";
Foo foo{1,2,3};
executor->add(std::bind(myfunction, i, s, foo));

将它与常规函数,成员函数,类似函数的对象(“functor”)或lambdas一起使用。对于内联lambda,它没有多大意义,因为你可以捕获lambda本身的数据。

executor->add([&i,s,&foo](){ ... use(i); use(s); use(foo); }

实际上,您始终可以将bind表达式替换为lambda,这可以让我更具可读性。比较:

int foo;
std::bind(std::operator<<, std::cout, foo);

VS

[foo]() { return std::cout << foo; }