c++ - 可变参数结构的多个参数包

问题描述 投票:0回答:1

这个问题与此类似 C++ - Multiple parameter packs for variadic function,但专门针对结构。

以下内容编译并运行良好(取自链接的问题)。

template <typename... TDependencies, typename ...TArgs>
void fooFunction(TArgs...args) {
    std::cout << "TDependecies list:" << std::endl;
   ((std::cout << "- " << typeid(TDependencies).name() << std::endl), ...);

    std::cout << "TArgs list:" << std::endl;
   ((std::cout << "- " << typeid(TArgs).name() << std::endl), ...);
}

int main()
{
    fooFunction<std::string, short, int, long, long long>(0, 1l, 2ll);
}

因为类型推导将根据提供给

fooFunction
的参数成功。

我的问题是,为什么这样的结构不能进行推导?


template <typename... TDependencies, typename ...TArgs>
struct fooStruct {
    fooStruct(TArgs...args) {
        std::cout << "TDependecies list:" << std::endl;
        ((std::cout << "- " << typeid(TDependencies).name() << std::endl), ...);

        std::cout << "TArgs list:" << std::endl;
        ((std::cout << "- " << typeid(TArgs).name() << std::endl), ...);
    }
};

int main()
{
    fooStruct<std::string, short, int, long, long long> s(0, 1l, 2ll);
}

编译器错误是

parameter pack ‘TDependencies’ must be at the end of the template parameter list

我尝试添加如下所示的用户推导指南,但这给出了错误

trailing return type ‘<type error>’ of deduction guide is not a specialization of ‘fooStruct<<declaration error>, TArgs>’

template <typename... TDependencies, typename ...TArgs>
fooStruct(const TArgs...) -> fooStruct<TDependencies..., TArgs...>;

有什么办法可以做到这一点吗?

就上下文而言,最终目标是使用类似的方法将两个可变参数包压缩在一起。

template <typename T1, typename T2>
struct base {

};

template <typename... T1, typename ...T2>
struct child : base<T1, T2>... {

    child(T2... args) {}
};

child
这里将使用
T2
但基础将使用
T1
T2

c++ templates metaprogramming template-meta-programming
1个回答
0
投票

错误很明显:标准禁止这样做。

要解决您的问题,您需要一个工厂功能。而且您知道如何编写该工厂函数。

标准禁止部分CTAD。它很复杂而且不清楚,所以他们取消了它。因此,除了工厂函数之外,没有办法推导出一半的参数。

template<class...Explicit, class...Implicit>
foo<pack<Explicit...>, pack<Implicit...>>
 make_foo(Implicit...);

使用

template<class...>struct pack{};

将参数分隔成两个包。

© www.soinside.com 2019 - 2024. All rights reserved.