繁体   English   中英

C ++传递函数按参数按模板类型进行调用

[英]C++ pass function to call by template type by parameter

我有一个类A ,它包装着T型模板对象容器。 在这种用例中, T应该是一个类。 A在提供的T类型上没有任何参考。

有没有一种方法可以在A实现一个函数来调用由参数传递的T函数? 伪代码:

template <class T>
void A:callFunction(functionToCall, functionParams, ...) {
        objectT->functionToCall(functionParams, ...);
}

objectT为T类型,functionToCall为void

我一直无法找到在C ++ 98中是否真的不可能做到以及为什么。 任何可能的解决方法也将有所帮助。

有可能,例如:

#include <iostream>
using namespace std;

struct bar
{
  void say(int a, int b)
  { cout << a << ' ' << b << endl; }
};

template <typename T>
struct foo
{
  template <typename fptr>
  void say(fptr f, int a, int b)
  {
    (i.*f)(a, b);
  }

  T i;
};

int main() {
  foo<bar> f;
  f.say(&bar::say, 10, 100);
}

(例如,它将在gcc上使用-std = c ++ 98进行编译)

如果您不希望将模板参数用于成员函数,则类似于:

void say(void (T::*f)(int, int), int a, int b)
{
  (i.*f)(a, b);
}

也应该工作。

正如@Nim所说的,只要您至少知道要转发的参数数量 (类型可以“模板化”)并仅为该数量的参数定义一个函数(或使用重载的多个函数),就可以。 无法为任何数量的参数创建函数转发器。

这仅在C ++ 11中使用“可变模板”功能才能实现:

template <class T, class Function, class... Args>
void A::callFunction(Function functionToCall, Args... functionParams) {
    bind(objectT, functionToCall, functionParams...);
}

注意:

objectT->functionToCall(functionParams, ...);

根本不可能,因为您不能将在类内部定义的符号指定为“自由符号”。 但是,您可以尝试利用“指向成员的指针”功能并执行以下操作:

(objectT->*functionToCall)(functionParams, ...);

只要此“ functionToCall”是指向对象objectT指向的类的成员函数的指针。 例如:

x->callFunction(&T::something, a, b);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM