我知道这个问题可能有点奇怪,但是C ++的创建者做到了这一点,每当我们用C ++创建一个函数时,我们可以指定我们想要的参数,例如我们可以创建一个这样的函数:
void function(int test);
我们可以创建这样的函数:
void function(std::string test);
如何重新创造效果?我正在创建一个类似CA#delegates的委托类,但是在参数方面我遇到了问题。我不知道他们想要在委托中存储什么类型的变量,所以我必须实现一些他们可以指定他们将使用哪些变量类型的东西。像这样:
委托myDelegate(std :: string,int,float);
有可能吗?我已经研究了可变函数,但你必须知道它的类型。我知道我可以像“%d和%s”这样的指标就像printf函数一样但是有没有办法实现它以便它接受对象名而不是指标?我希望这很容易理解。
答案 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。此外,如果需要未来的代码维护,它将提供最清晰(至少这是我的预感)。无论如何,这将产生您正在描述的行为。