创建接受可变数量参数和数据类型的函数 我知道这个问题有点奇怪,但是C++的创作者使我们在C++中创建函数时,我们可以指定我们想要的参数,例如,我们可以创建这样的函数: void function(int test); void function(std::string test);

创建接受可变数量参数和数据类型的函数 我知道这个问题有点奇怪,但是C++的创作者使我们在C++中创建函数时,我们可以指定我们想要的参数,例如,我们可以创建这样的函数: void function(int test); void function(std::string test);,c++,function,object,methods,variadic,C++,Function,Object,Methods,Variadic,我们还可以创建如下函数: void function(int test); void function(std::string test); 我如何重新创造这种效果?我正在创建一个delegate类,它的工作方式有点像CA#delegates,但在参数方面我遇到了一个问题。我不知道他们想在委托中存储什么类型的变量,所以我必须实现一些东西,他们可以指定他们要使用的变量类型。大概是这样的: void function(int test); void function(std::strin

我们还可以创建如下函数:

void function(int test); 
void function(std::string test); 
我如何重新创造这种效果?我正在创建一个delegate类,它的工作方式有点像CA#delegates,但在参数方面我遇到了一个问题。我不知道他们想在委托中存储什么类型的变量,所以我必须实现一些东西,他们可以指定他们要使用的变量类型。大概是这样的:

void function(int test); 
void function(std::string test); 
委托myDelegate(std::string、int、float)


有可能吗?我研究过变量函数,但你也必须知道该转换哪种类型。我知道我可以像printf函数一样使用“%d和%s”这样的指示符,但是有没有办法实现它,使它接受对象名而不是指示符?我希望这很容易理解。

您可以使用可变参数列表。下面是一个简单的例子:

#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>

template <typename... T>
class Delegate {
    std::vector<std::function<void(T...)>> d_delegates;
public:
    template <typename F>
    void add(F&& f) { this->d_delegates.push_back(std::forward<F>(f)); }

    template <typename... S>
    void operator()(S... args) const {
        std::for_each(this->d_delegates.begin(), this->d_delegates.end(),
                      [&](std::function<void(T...)> const& f){ f(args...); });
    }
};

void f1(int i) { std::cout << "f1(" << i << ")\n"; }
void f2(int i, double d) { std::cout << "f2(" << i << ", " << d << ")\n"; }

int main() {
    Delegate<int> d1;
    d1.add(f1);
    d1(17);

    Delegate<int, double> d2;
    d2.add(f2);
    d2(42, 3.14);
}
#包括
#包括
#包括
#包括
模板
类委托{
std::向量d_代表;
公众:
模板
void add(F&&F){this->d_委托。向后推(std::forward(F));}
模板
void运算符()(S…args)常量{
std::for_each(this->d_delegates.begin(),this->d_delegates.end(),
[&](std::function const&f){f(args…;});
}
};

voidf1(inti){std::cout一个简单的解决方案就是。而且,如果将来需要代码维护,它将提供最清晰的说明(至少这是我的直觉)。无论如何,这将产生您所描述的行为。

对模板进行一些研究。感谢此解决方案。我提出了类似的解决方案,但我应该提到,我使用的visual studio没有2012年11月的更新。我试图在编程作业中超越这些,但我不认为c我学校的电脑有更新,因此不支持可变模板。尽管是个简单的问题。F&&F做什么?函数重载是实现我目标的基本方法。我希望这个人能够确定他们传递的类型和数量。你不能期望我对每种可能的场景都进行重载o、 谢谢你的回答:)