考虑具有可变参数模板参数的模板化函数的情况:
template<typename Tret, typename... T> Tret func(const T&... t);
Run Code Online (Sandbox Code Playgroud)
现在,我有一个t价值元组.如何func()使用元组值作为参数调用?我已经阅读了bind()函数对象,call()函数,以及apply()不同的一些现在过时的文档中的函数.GNU GCC 4.4实现似乎call()在bind()类中有一个函数,但是关于这个主题的文档很少.
有些人建议使用手写的递归黑客,但可变参数模板参数的真正价值在于能够在上述情况下使用它们.
有没有人有解决方案,或提示在哪里阅读它?
在可变参数模板类型列表(参数包)中实现基于索引的插入和删除类型的最佳方法是什么?
期望的代码/行为:
template<typename...> struct List { /* ... */ };
static_assert(is_same
<
List<int, char, float>::Insert<int, 0>,
List<int, int, char, float>
>());
static_assert(is_same
<
List<int, char, float>::Insert<int, 2>,
List<int, char, int, float>
>());
static_assert(is_same
<
List<int, char, float>::Remove<0>,
List<char, float>
>());
static_assert(is_same
<
List<int, char, float>::Remove<1>,
List<int, float>
>());
Run Code Online (Sandbox Code Playgroud)
我尝试了一个基于在最初为空的列表中推回参数的实现,但是它很难读取/维护.参数类似于:
template<typename T, int I, int ITarget, typename TResult> struct InsertImpl;
Run Code Online (Sandbox Code Playgroud)
我不断增加I直到它等于ITarget,推回现有的类型TResult,这是一个List<...>.当I等于ITarget,我推回T的TResult为好.
删除类型有一个类似的实现 - 而不是在索引相等时两次推回,我只是跳过了类型.
我的繁琐解决方案将在推送和弹出方面实现插入和删除.我相信推到前面等于 …