Вызов аналогичных функций с различным количеством параметров с одной шаблонной функцией - PullRequest
0 голосов
/ 28 мая 2018

У меня есть две функции, которые вызывают внешние библиотечные функции, за исключением того, что у одной есть два дополнительных параметра (скажем, дополнительные параметры всегда равны нулю).

void func1(int a, int b)
{
    libDoAThing(a, b);
}

void func1Special(int a, int b)
{
    libDoAThingWithTwoExtraParams(a, b, 0, 0);
}

Есть ли способ объединить эти методы в один метод, который можно вызвать так:

func1<libDoAThing>{10, 10};
func1<libDoAThingWithTwoExtraParams>{10, 10};

Я не уверен, как обрабатывать два дополнительных параметра ввызов функции при шаблонировании.

1 Ответ

0 голосов
/ 28 мая 2018

Если вы можете использовать хотя бы C ++ 11, вы можете исправить последние два параметра с помощью std::bind() или, я предлагаю, с помощью лямбда-функции.

Так что вам не нужен параметр шаблона: вы можете передать результирующую лямбду в качестве аргумента func1() и вызвать ее внутри.

Ниже приводится полный рабочий пример с лямбда

#include <iostream>

void foo (int a, int b)
 { std::cout << "foo: " << a << ", " << b << std::endl; }

void bar (int a, int b, int c, int d)
 { std::cout << "bar: " << a << ", " << b << ", " << c << ", " 
      << d << std::endl; }

void func1 (void(*f)(int, int), int x, int y)
 { f(x, y); }

int main ()
 {
   auto l { [](int a, int b){ bar(a, b, 0, 0); } };

   func1(foo, 1, 2);
   func1(l,   3, 4);
 }
...