Непонятно, чего вы пытаетесь достичь, но вот пример того, как ваш код можно перевести на действительный C++. Во-первых, давайте определим ваш Func
с максимальным количеством аргументов:
template<typename T1, typename T2>
void Func(T1 par1, T2 par2) {
std::cout << par1 << " " << par2 << std::endl;
}
Затем мы должны заставить FuncFunc
принимать любую функцию, которую вы хотите:
template<typename ...T>
void FuncFunc(const std::function<void(T...)>& fPtr) {
std::string funcVar = "Foo!";
fPtr(funcVar);
}
или более простой в использовании вариант:
template<typename F>
void GuncFunc(const F& fPtr) {
std::string funcVar = "Foo!";
fPtr(funcVar);
}
и, наконец, используйте FuncFunc
:
auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1);
auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42);
FuncFunc(std::function<void(std::string)>(Func1));
FuncFunc(std::function<void(std::string)>(Func2));
return 0;
or GuncFunc
:
// Using std::bind
GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1));
GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42));
// Or using lambdas:
GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);});
GuncFunc([](std::string s){Func<std::string, int>(s, 42);});
Выбор std::bind
или lambdas, похоже, выходит за рамки вашего вопроса, но вы можете найти что-то полезное здесь, здесь или в этот вопрос.
В любом случае, скорее всего, вам понадобятся лямбды, std::function, std::bind или вариативные шаблоны.
person
Sergey
schedule
18.08.2016