相关疑难解决方法(0)

如何将元组扩展为可变参数模板函数的参数?

考虑具有可变参数模板参数的模板化函数的情况:

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()类中有一个函数,但是关于这个主题的文档很少.

有些人建议使用手写的递归黑客,但可变参数模板参数的真正价值在于能够在上述情况下使用它们.

有没有人有解决方案,或提示在哪里阅读它?

c++ arguments tuples c++11

127
推荐指数
6
解决办法
4万
查看次数

将类型插入/删除到可变参数模板列表(参数包)

在可变参数模板类型列表(参数包)中实现基于索引的插入和删除类型的最佳方法是什么?

期望的代码/行为:

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,我推回TTResult为好.

删除类型有一个类似的实现 - 而不是在索引相等时两次推回,我只是跳过了类型.

我的繁琐解决方案将在推送和弹出方面实现插入和删除.我相信推到前面等于 …

c++ templates metaprogramming variadic-templates c++14

5
推荐指数
1
解决办法
1691
查看次数