Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用单个模板函数调用具有不同参数计数的类似函数_C++_Templates_Overloading - Fatal编程技术网

C++ 使用单个模板函数调用具有不同参数计数的类似函数

C++ 使用单个模板函数调用具有不同参数计数的类似函数,c++,templates,overloading,C++,Templates,Overloading,我有两个函数调用外部库函数,除了一个函数有两个额外的参数(假设额外的参数总是零) 有没有办法将这些方法组合成一个可以这样调用的方法: func1<libDoAThing>{10, 10}; func1<libDoAThingWithTwoExtraParams>{10, 10}; func1{10,10}; 函数1{10,10}; 我不确定在模板制作时如何处理函数调用中的两个额外参数。如果您至少可以使用C++11,您可以使用std::bind()或我建议使用lambd

我有两个函数调用外部库函数,除了一个函数有两个额外的参数(假设额外的参数总是零)

有没有办法将这些方法组合成一个可以这样调用的方法:

func1<libDoAThing>{10, 10};
func1<libDoAThingWithTwoExtraParams>{10, 10};
func1{10,10};
函数1{10,10};

我不确定在模板制作时如何处理函数调用中的两个额外参数。

如果您至少可以使用C++11,您可以使用
std::bind()
或我建议使用lambda函数修复最后两个参数

因此,您不需要模板参数:您可以将生成的lambda作为
func1()
的参数传递,并在内部调用它

下面是lambda的完整工作示例

#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);
 }
#包括
无效foo(内部a、内部b)

{std::cout这看起来像一个XY问题。你想解决的真正问题是什么?不是,不是关于“组合这些方法”的问题,但您认为解决方案的真正问题是使用这种单一模板函数。这是一位同事向我建议的解决方案。我问这个问题是因为我不知道如何从技术上实现它。解决方案到底是什么?而不是假设这是解决方案,然后尝试解决如果你不知道如何去做,那么描述真正的问题就更有意义了。很可能存在一种完全不同的方法,它更简单、更直接。我不同意你的观点,即可能有更好的总体解决方案来解决这个问题。然而,我对如何在代码方面实现这一点感兴趣,因为我不知道我不知道怎么做。这更多的是一个“我该如何编写代码?”的问题,而不是“我的情况的最佳解决方案是什么?”的问题。
#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);
 }