use*_*653 10 c++ templates variadic
我有以下内容:
template<typename FIRST, typename SECOND>
Sender *createSenderChain() {
return new FIRST(new SECOND());
}
Run Code Online (Sandbox Code Playgroud)
是否可以使模板可变:
template<typename FIRST, typename ...Args>
Sender *createSenderChain() {
return new FIRST(new SECOND(new THIRD(new ...)) <-- This is the pattern I want,
but how should it be done
using the args list?
}
Run Code Online (Sandbox Code Playgroud)
你可以使用递归!
猜测你的定义Sender:
struct Sender { ~Sender() {} };
struct A : Sender { A(Sender* = nullptr) {} };
struct B : Sender { B(Sender* = nullptr) {} };
struct C : Sender { C(Sender* = nullptr) {} };
// Base case
template <typename T>
Sender* createSenderChain()
{
return new T();
}
// Recursive case
template <typename T1, typename T2, typename ...Ts>
Sender* createSenderChain()
{
return new T1(createSenderChain<T2, Ts...>());
}
int main()
{
auto ptr = createSenderChain<A, B, C>();
}
Run Code Online (Sandbox Code Playgroud)
您可以使用不同的模板参数调用相同的可变参数模板函数:
template<typename FIRST, typename SECOND, typename ...Args>
Sender* createSenderChain() {
return new typename FIRST(createSenderChain<SECOND, Args...>());
}
template<typename FIRST>
Sender* createSenderChain() {
return new typename FIRST();
}
Run Code Online (Sandbox Code Playgroud)
在第一个函数中,我们不仅明确声明typename FIRST,而且还typename SECOND避免将此实现与createSenderChain<T>调用进行匹配,因为可变参数部分可能与空类型列表匹配。