【发布时间】: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