Я работаю над базой кода C ++ 11 и задаюсь вопросом, как я могу вызвать любую функцию для типа члена, передавая произвольные аргументы. Обратите внимание, что, поскольку я использую C ++ 11, я не могу использовать что-то вроде std::invoke
.
Я начал создавать шаблон функции в классе Outer
, но мой начальный try дает мне ошибку компиляции.
#include <iostream>
#include <utility>
#include <type_traits>
struct Inner {
void bar(int x) {
std::cout << "Called: x=" << x << std::endl;
}
};
struct Outer {
explicit Outer(Inner *i) : b{i} {}
void foo(int) {}
Inner* b;
template <typename Func, typename ... Args>
void CallInner(Func&& f, Args&& ... args) {
b->f(std::forward<Args>(args)...);
}
};
int main() {
Inner inner{};
Outer outer(&inner);
outer.CallInner(&Inner::bar, 5);
}
Попробуйте сами
Опять же, я хотел бы сохранить сигнатуру функции CallInner
без изменений от приведенный выше пример кода.