迭代C++可变参数模板

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)

Lig*_*ica 9

你可以使用递归!

猜测你的定义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)

(现场演示)

  • 顺便说一下,在原始`new`上更喜欢`std :: unique_ptr`或`std :: shared_ptr`.我的演示有三个内存泄漏! (6认同)

ale*_*in0 5

您可以使用不同的模板参数调用相同的可变参数模板函数:

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>调用进行匹配,因为可变参数部分可能与空类型列表匹配。