【问题标题】:I want to create a std::function but add args incrementally我想创建一个 std::function 但增量添加 args
【发布时间】:2015-09-28 17:01:42
【问题描述】:

我希望有人可以在这里帮助我一点。我对 C++ 以及模板的概念都比较陌生。 我需要根据我在列表中获得的一些数据创建一个 std::function 。 函数的签名应根据可用的数据。我正在寻找这样的东西

template <typename ret, typename... Args, typename newArg>
struct typeparser<ret(...Args)>{
    typeparser<ret(...Args)> insertArg(newArg)
    { 
       retrun typeparser <ret(...args, newArg) > ; 
    }
};

我想要做的是遍历boost::variant 的向量,然后根据我看到的值的类型,在完成后将其添加到参数列表中,创建一个std:function 并从库中加载它,然后执行它。有意义吗?

std::vector<boost::varient<int, char, std::string>> list;
arglist = typeparser<int()>;   //all functions have int return, so start with return int and 0 args
for(boost::varient<int, char, std::string> a : list) {
    if(a.type() ==  typeid(int)){
        arglist.addArg(int); // now add int to list of args
    } else 
    if(a.type()== typeid(char)) {
       arglist.add(char);
    } else
    if (a.type()== typeid(bla)) {
        arglist.add(bla);
    }
  } // end for 
//now create the function here 
std::function<arglist> f = //load from library;

这看起来可能吗?也许我以错误的方式看待问题?在这个时候任何事情都会有所帮助。 非常感谢!!

【问题讨论】:

  • 这听起来很难实现。由于每个不同的参数列表都会创建一个不同的类型,并且必须已经编译,因此您需要预测每个可能的参数列表,并创建某种从参数列表到可以在运行时使用的函数的映射(或编译器的名称 mangler可能可以做那一点)。我建议首先询问您实际上想要实现的目标,也许会出现一个更简单的解决方案。
  • 模板在编译时被评估(实例化),所以你不能在运行时改变任何东西。我看不到任何方法,如何在运行时实现这一点。不过还有其他机制,您可以在运行时执行此操作。
  • 为什么不让你的函数取一个范围(迭代器对)呢?然后所有的工作都可以在你知道参数是什么的运行时发生。

标签: c++ templates c++11 boost std-function


【解决方案1】:

std::function 必须在编译时指定其所有参数——您所要求的将要求参数集直到运行时才知道,这是不允许的。

理论上可以通过 std::function 之类的东西来实现您的提议,其中包含要调用的一堆参数或类似的东西,但我不相信有一种可移植的方式来做到这一点.

听起来你最好寻求一个解决方案来解决你需要这个“运行时std::function”的问题。

【讨论】:

  • +1 暗示XY problem
  • 我明白你的意思,是的,如果编译器想在编译时知道,那么用这种方法是无法克服的。我正在尝试做的是扩展我们当前的库之一,以便它可以在网络上工作(理论上是 RPC),但是我查看的一些框架太复杂了,我想也许我可以解决这样的问题。我试图实现的是,让服务器监听,当请求到来时,查看它并从现有库中按名称获取函数并调用它。有什么建议吗? (有意义吗?)谢谢!
  • @codeCruncher:如果可能的话,它会在您的应用程序中创建一个巨大的漏洞,因为恶意客户端可能会发送DeleteFileW 或类似内容。您可能希望查看使用某种形式的接口定义语言并将其显式连接到您的服务器的许多现有 RPC 解决方案之一。例如grpc.io 或 COM 远程处理或类似的
  • @BillyONEal 谢谢,这实际上是我开始做的事情。我偶然发现了令人生畏的 zeroC,can'n Proto,它看起来不错,我将按照您的建议通过 grpc,就在旁边,(如果您已经知道)我可以将函数指针作为参数传递给调用吗回到客户端?当服务器上的某些东西调用这个回调时,客户端就知道了。有道理?如果有类似的东西?
  • @code: 不,该函数在服务器和客户端上的地址几乎肯定会不同。
猜你喜欢
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2021-09-01
  • 2021-10-13
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多