我想用来自向量的参数调用一个函数。仅此一项当然非常简单,但我想编写一个通用包装器来为我完成任务。稍后它还应该从像 boost::variant 这样的泛型类型进行转换,但我想在这个问题解决后我可以处理这个问题。
这是我的第一次尝试:
#include <iostream>
#include <functional>
#include <vector>
using namespace std;
void foo(int a, int b)
{
cout << a*10+b << endl;
}
template<class... Args>
void callByVector(std::function<void(Args...)> f, vector<int>& arguments)
{
int i = 0;
f(static_cast<Args>(arguments[i++])...);
}
int main()
{
vector<int> arguments;
arguments.push_back(2);
arguments.push_back(3);
callByVector(std::function<void(int,int)>(foo),arguments);
}
它有效,但正如您可能猜到的那样,增量的执行顺序没有定义。
因此,总体结果可以是 23 或 32(我可以用不同的编译器确认)。
有什么想法或者我必须忘记这一点吗?
问候,
弗洛里安
您可以为此目的使用索引。给定这个编译时整数序列生成器:
template<int... Is>
struct seq { };
template<int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };
template<int... Is>
struct gen_seq<0, Is...> : seq<Is...> { };
您可以让原始函数将工作委托给使用附加参数调用的辅助函数,该参数允许推导整数序列。参数包扩展将完成剩下的工作:
template<class... Args, int... Is>
void callByVector(
std::function<void(Args...)> f, vector<int>& arguments, seq<Is...>)
{
f(arguments[Is]...);
}
template<class... Args>
void callByVector(std::function<void(Args...)> f, vector<int>& arguments)
{
callByVector(f, arguments, gen_seq<sizeof...(Args)>());
}
这里有一个活生生的例子.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)