0

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

void function(int test); 

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

void function(std::string test); 

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

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

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

4

2 回答 2

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);
}
于 2013-10-01T05:51:24.827 回答
0

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

于 2013-10-01T06:10:50.267 回答