【问题标题】:Call function parameters in C++11 using variadic templates使用可变参数模板在 C++11 中调用函数参数
【发布时间】:2012-11-27 02:22:58
【问题描述】:

关注@Xeo's excellent code:

我想知道如何模板化函数的返回类型,而不是通过以下方式解释返回:

std::string* out_opt

它可以改为为给定函数返回适当的类型。

另外,在@Xeo 的示例代码之后,我想知道绑定具有多个参数的成员函数的最佳方法是...

func_dict["someFunc"] = stream_function<int(int,int)>( std::bind( &MyClass::functionName, instanceOfMyClass, std::_1, std::_2 ) );

这是一个好方法吗?有什么办法可以避免需要明确声明 _1、_2 等?

【问题讨论】:

  • 您是否希望所有函数都具有相同的返回类型(只是不通过string* 返回?这应该相对容易。如果您不希望这样,则需要调用者静态知道函数的返回类型,从而使整个调度机制变得毫无意义(不是很有用,如果你需要事先知道你在调用什么)并且更难实现,因为函数对象会有不同的类型。
  • 不,我不希望它们都返回相同的类型。我正在寻找概括代码,以便函数对象可以具有不同的类型。为什么这种机制没有用?
  • 你可以返回一个 boost::any 而不是通过字符串 outparam 的东西,以避免在调用函数时转换为值的字符串表示形式,但它不会是太多改进,因为调用者需要提前知道类型才能转换 boost::any。
  • @pt3dNyc:如果您想从函数中获取返回值,您需要知道期望的类型。这意味着您需要事先知道要调用哪个函数(如果它们具有不同的返回类型)。如果您知道要调用的函数,那么您需要整个调度机制来做什么。作为旁注:如果您对之前的评论做出反应,您可能希望以@Username 开始您的评论,因为这会通知被寻址的用户,从而加快反应时间。
  • @Grizzly,我明白你的意思。我正在查看:loki-lib.cvs.sourceforge.net/loki-lib/loki/include/loki/…,它确实实现了返回类型,但由于您指出的原因,它可能不是很有用。

标签: c++ templates c++11


【解决方案1】:

如果这是 C++11,为什么不呢

func_dict["someFunc"] = stream_function<int(int,int)>( 
    [&](int x, int y)
    {
      MyClass::functionName(instanceOfMyClass, x, y);
    });

否则,我认为您总是需要以一种或另一种方式明确陈述论点。

【讨论】:

  • 以上是否正确?我在“[&]”(应为表达式)上收到语法错误。你能指点我这个语法的一些文档吗?谢谢。
  • @pt3dNyc 这意味着您的编译器不支持 lambda。在最近的 Clang 版本上尝试一下。
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2021-10-01
  • 2012-08-14
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多