Nie powiedział, co można oczekiwać, aby być w stanie zrobić z func2
po umieszczeniu go w wektorze z niewłaściwym rodzaj.
można łatwo używać std::bind
, aby umieścić go w wektorze jeśli znasz argumenty wyprzedzeniem:
const std::vector<std::function<void(std::string)>> functions
{
func1,
std::bind(func2, std::placeholders::_1, 5, 6)
};
Teraz functions[1]("foo")
wezwie func2("foo", 5, 6)
i przejdzie 5
i 6
do func2
za każdym razem.
Tutaj to samo przy użyciu lambda zamiast std::bind
const std::vector<std::function<void(std::string)>> functions
{
func1,
[=](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};
Jeśli nie wiesz jeszcze argumenty, można wiązać odniesień do pewnych zmiennych:
int func2_arg1 = 5;
int func2_arg2 = 6;
const std::vector<std::function<void(std::string)>> functions
{
func1,
std::bind(func2, std::placeholders::_1, std::ref(func2_arg1), std::ref(func2_arg2))
};
Teraz functions[1]("foo")
wezwie func2("foo", func2_arg1, func2_arg2)
i możesz przypisać nowe wartości do liczb całkowitych, aby przekazać różne argumenty do func2
.
i za pomocą funkcji lambda zamiast std::bind
const std::vector<std::function<void(std::string)>> functions
{
func1,
[&](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};
Jest to dość brzydki choć, jak trzeba zachować int
zmienne około tak długo, jak na żądanie obiektu (zamknięcia lub wyrażenia wiązania) odnosząc dla nich istnieje.
Dlaczego po prostu nie dać im te same podpisy. Nie musisz używać wszystkich parametrów w funkcji –
Dlaczego musisz użyć do tego wektora? Wektor może zawierać tylko typy, które mają ten sam typ (liczba polimorfizmów). Jeśli masz funkcje z różnymi podpisami, nie będziesz w stanie zrobić np. 'for (funkcja auto &&: funkcje) {funkcja(); } ', więc i tak musisz je rozdzielić, lub ujednolicić swoje podpisy (ale jeśli mają różne podpisy, ta ostatnia opcja wydaje się być brutalna - zmuszając ich do wtajemniczenia ...) – JBL
@EdHeal - Myślę, że mogłem. Zastanawiam się tylko nad alternatywami. – ksl