是否可以在 C 中将函数(-name)作为模板参数?

新手上路,请多包涵

我不想要函数指针开销,我只想要具有相同签名的两个不同函数的相同代码:

 void f(int x);
void g(int x);

...

template<typename F>
void do_work()
{
  int v = calculate();
  F(v);
}

...

do_work<f>();
do_work<g>();

这可能吗?


为了消除可能的混淆:“模板参数”是指模板 的参数/参数,不是 类型为 templated 的函数参数。

原文由 Martin Ba 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 622
2 个回答

一种极有可能生成直接函数调用的方法是使用静态成员函数,因为它没有给编译器选项:

 struct F { static void func(int x) { /*whatever*/ } };
struct G { static void func(int x) { /*whatever*/ } };

template<class T>
void do_work() {
    T::func(calculate());
}

没有函数指针,没有临时变量,也没有不必要 this 。当然,我什么都不保证,但是即使禁用了优化,生成的代码也应该是合理的。

原文由 please delete me 发布,翻译遵循 CC BY-SA 2.5 许可协议

你的想法没问题,但你不是在传递一个类型,而是一个值(特别是一个函数指针>。或者,传递一个提供函数的模板策略 - 阅读 Andrei Alexandrescu 的 Modern C++ Design 是个好主意。

 #include <iostream>

int f(int x) { return 2 * x; }
int g(int x) { return -3 * x; }

typedef int (*F)(int);

template<F f>
int do_work()
{
    return f(7);
}

int main()
{
    std::cout << do_work<f>() << '\n'
              << do_work<g>() << '\n';
}

或者

int calculate() { return 4; }

struct F { int do_something_with(int x) { return 2 * x; } };
struct G { int do_something_with(int x) { return -3 * x; } };
// or, make these functions static and use Operator::do_something_with() below...

template<typename Operation>
int do_work()
{
    int v = calculate(7);
    return Operation().do_something_with(v);
}

int main()
{
    std::cout << do_work<F>() << '\n'
              << do_work<G>() << '\n';
}

原文由 Tony Delroy 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题