【问题标题】:Calling similar functions with different parameter count with a single templated function使用单个模板函数调用具有不同参数计数的类似函数
【发布时间】:2018-05-27 23:17:13
【问题描述】:

我有两个调用外部库函数的函数,除了一个有两个额外参数(假设额外参数始终为零)。

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};

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

【问题讨论】:

  • 这看起来像是一个 XY 问题。您要解决的真正问题是什么。不是,不是关于“组合这些方法”的问题,而是您认为解决方案的真正问题涉及拥有此类单一模板函数。
  • 这是一位同事向我建议的解决方案。我问这个问题是因为我不知道如何在技术上实现它。
  • 解决方案到底是什么?与其假设这是解决方案,并试图弄清楚如何去做,不如描述真正的问题更有意义。很可能存在一种完全不同的方法,它更简单、更直接。
  • 我不同意你的观点,可能有更好的整体解决方案来解决这个问题。但是,我对如何以代码方式完成这一点很感兴趣,因为我不知道如何做到这一点。这更像是“我将如何编码?”而不是“我的情况的最佳解决方案是什么?”问题。

标签: c++ templates overloading


【解决方案1】:

如果您至少可以使用 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);
 }

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多