C++ 有没有一种方法可以使用不同数量的变量调用函数?

C++ 有没有一种方法可以使用不同数量的变量调用函数?,c++,c++11,templates,std-function,C++,C++11,Templates,Std Function,我想设计一种方法来调用许多非常相似的函数中的一个,其中唯一的区别是参数的数量。请记住,这是我的大问题的一个最小的例子。我有很多功能来完成不同的任务。每个函数原型都非常相似——只是它们有不同数量的参数 我希望能够调用一些包装类,告诉它测试类型,并向它传递一个参数列表向量,然后它为我排序其余的 以下是一个工作设置,其中包含无法工作的零件: #include <vector> #include <map> #include <functional> #include

我想设计一种方法来调用许多非常相似的函数中的一个,其中唯一的区别是参数的数量。请记住,这是我的大问题的一个最小的例子。我有很多功能来完成不同的任务。每个函数原型都非常相似——只是它们有不同数量的参数

我希望能够调用一些包装类,告诉它测试类型,并向它传递一个参数列表向量,然后它为我排序其余的

以下是一个工作设置,其中包含无法工作的零件:

#include <vector>
#include <map>
#include <functional>
#include <iostream>

enum class test_type {t0, t1, t2, t3, t4, tn};

class tester
{
public:
    void run(test_type type, const std::vector<int> &args)
    {
        func_map[type].func();
    };

private:    
    void function_0()                       { std::cout << "f0\n"; };
    void function_1(int p1, int p2)         { std::cout << "f1\n"; };
    void function_2(int p1, int p2, int p3) { std::cout << "f2\n"; };
    void function_3(int p1, int p2)         { std::cout << "f3\n"; };
    void function_4(int p1)                 { std::cout << "f4\n"; };
    void function_n(int p1)                 { std::cout << "fn\n"; };


    struct test_info
    {
        std::function<void()> func; // variadic function std::function<void(...)> ?
        int num_params;
    };

    std::map<test_type, test_info> func_map {
        {test_type::t0, {[this]{function_0();}, 0}}
        // {test_type::t1, {[this]{function_1();}, 2}}
        // {test_type::t2, {[this]{function_2();}, 3}}
        // {test_type::t3, {[this]{function_3();}, 2}}
        // {test_type::t4, {[this]{function_4();}, 1}}
        // {test_type::tn, {[this]{function_n();}, 1}}
    };
};

int main() {

    tester test;
    test.run(test_type::t0, {});
    //test.run(test_type::t1, {1, 2});
    //test.run(test_type::t2, {1, 2, 3});
    //test.run(test_type::t3, {1, 2});
    //test.run(test_type::t4, {1});
    //test.run(test_type::tn, {1});

    return 0;
}
这是因为函数_0有0个参数,因此与std::function type匹配。我真的不确定从这里开始的最佳方向是什么

我认为可以选择使用variadic std::function,但是阅读这篇文章让我超越了我的混淆区,我对variadic模板的理解也不是很好

因此,我的问题是:

这可以通过varidic std::Function以某种方式实现吗? 有没有更好的方法来实现这一点? 将向量本身传递给包装器lambda,让它们提取int值并传递给目标函数,例如:

包括 包括 包括 包括 包括 枚举类测试类型{t0,t1,t2,t3,t4,tn}; 类测试员 { 公众: void runtest_类型,const std::vector和args { 函数映射[类型]参数; }; 私人:
空洞函数{ STD::“把ARGS向量传递给函数是什么错误?”“你想要的是不可能的。你不能有STD::函数,它不是有效的C++。所以你可以使用原始函数指针Vule*FUNC…,但是你可以拥有这个,或者你可以把它作为FUNC的第一个ARG,但是你不能用GCC使用lambda,那么你可以使它静止,B。ut…这个列表还在继续。此时,你最好重新考虑一下你的设计,或者至少澄清一下你试图通过这个来实现的目标。@Ernon在我的例子中,这个函数列表已经存在了——我只是想写一种包装器来减少重复代码的数量。如果它们都只接受一个args向量,那将是非常理想的:有y吗您考虑过使用最坏情况下的参数数(即变量)创建函数a,然后为所有函数分配一个默认值?我曾经实现过一个函数int grepstring pfn,string pattern1=nullptr,string pattern2=nullptr,…string patternN=nullptr;对于情况0,N为5,调用为int v=greppfn;对于情况1,调用为int v=grep pfn,p1;对于案例2,调用为int v=greppfn,p1,p2;…等等。从操作上讲,实现通过第一个参数工作,然后在pJ为null ptr时退出;@Holt这是我的设计版本,重新思考,继续!。关于更大的重构,你可能是对的-我依赖于某种可变的std::函数或模板:这是c当然比我所拥有的要好:-我本想找到一种避免重复的方法,但我认为这需要更大的设计更改。谢谢: