gpt4 book ai didi

c++ - 可变参数模板参数的传递位置

转载 作者:可可西里 更新时间:2023-11-01 17:26:05 30 4
gpt4 key购买 nike

我想创建一个函数,它接受可变数量的模板参数。稍后使用这些参数,函数应该像这样传递它们的位置:

template<typename R, typename Args...>
R myFunction(Data &data, void *function) {
auto f = (R (*)(Args...))function;
return f(read<Args1>(data, 1), read<Args2>(data, 2), ...);// <-- This is the problem
}

给定的代码当然是不可编译的。有什么办法可以解决吗?有没有一种方法可以在没有太多代码重复的情况下不用可变参数模板来做到这一点?

最佳答案

是的,这是可能的:

// we need a compile-time helper to generate indices
template< std::size_t... Ns >
struct indices
{
typedef indices< Ns..., sizeof...( Ns ) > next;
};

template< std::size_t N >
struct make_indices
{
typedef typename make_indices< N - 1 >::type::next type;
};

template<>
struct make_indices< 0 >
{
typedef indices<> type;
};

有了这些助手,您需要一个转发器来实现这样的功能:

template<typename R, typename... Args, std::size_t... Ns>
R myFunctionImpl(void *Data, void *function, indices<Ns...> ) {
auto f = (R (*)(Args...))function;
return f(read<Args>(Data, Ns + 1)...);// +1 because indices is zero-based
}

template<typename R, typename... Args>
R myFunction(void *Data, void *function) {
return myFunctionImpl< R, Args... >( Data, function, typename make_indices<sizeof...(Args)>::type() );
}

编辑:它是如何工作的?首先,我们确定 argument pack 的大小Args通过 sizeof... . make_indices<N>::type然后扩展为 indices<0,1,2,...,N-1> .它作为附加参数提供给实现函数(来自刚刚创建虚拟实例的转发器),因此参数推导在实现函数端开始并将生成的索引放入参数包 Ns 中。 .

实现函数现在有两个相同大小的参数包,即ArgsNs .当通过省略号展开时 ... ,省略号扩展了它所应用的整个表达式,并并行扩展了所有参数包!在上面的例子中,表达式是 read<Args>(Data, Ns+1) ,它很好地扩展为 OP 伪代码。

关于c++ - 可变参数模板参数的传递位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204649/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com