创建具有可变数量的参数和数据类型的函数

时间:2013-10-01 05:41:12

标签: c++ function object methods variadic

我知道这个问题可能有点奇怪,但是C ++的创建者做到了这一点,每当我们用C ++创建一个函数时,我们可以指定我们想要的参数,例如我们可以创建一个这样的函数:

void function(int test); 

我们可以创建这样的函数:

void function(std::string test); 

如何重新创造效果?我正在创建一个类似CA#delegates的委托类,但是在参数方面我遇到了问题。我不知道他们想要在委托中存储什么类型的变量,所以我必须实现一些他们可以指定他们将使用哪些变量类型的东西。像这样:

委托myDelegate(std :: string,int,float);

有可能吗?我已经研究了可变函数,但你必须知道它的类型。我知道我可以像“%d和%s”这样的指标就像printf函数一样但是有没有办法实现它以便它接受对象名而不是指标?我希望这很容易理解。

2 个答案:

答案 0 :(得分:1)

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

#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);
}

答案 1 :(得分:0)

一个简单的解决方案就是function overloading。此外,如果需要未来的代码维护,它将提供最清晰(至少这是我的预感)。无论如何,这将产生您正在描述的行为。