相关疑难解决方法(0)

实现C++ 14 make_integer_sequence

我尝试实现C++ 14别名模板make_integer_sequence,这简化了类模板的创建integer_sequence.

template< class T, T... I> struct integer_sequence
{
    typedef T value_type;
    static constexpr size_t size() noexcept { return sizeof...(I) ; }

};

template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.
Run Code Online (Sandbox Code Playgroud)

为了实现,make_integer_sequence我们需要一个辅助结构make_helper.

template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
Run Code Online (Sandbox Code Playgroud)

实施make_helper并不太难.

template< class T, T N, T... I >
struct make_helper
{
   typedef …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11 c++14

47
推荐指数
3
解决办法
2万
查看次数

选择可变参数模板的最后一个参数的有效方法

我知道如何选择可变参数模板的第一个参数:

template< class...Args> struct select_first;
template< class A, class ...Args> struct select_first<A,Args...>{  using type = A;};
Run Code Online (Sandbox Code Playgroud)

这很简单.但是,select_last不相似:

template< class ...Args> struct select_last;
template< class A> struct select_last<A> { using type = A; };
template< class A, class Args...> struct select_last<A,Args...>{ 
        using type = typename select_last<Args...>::type;
};
Run Code Online (Sandbox Code Playgroud)

该解决方案需要深度递归模板即时.我尝试用以下方法解决这个问题:

template< class A, class Args...>
struct select_last< Args ... , A>{  using type = A; }; // but it's not compiled.
Run Code Online (Sandbox Code Playgroud)

问:存在更有效的方法来选择可变参数模板的最后一个参数吗?

c++ variadic-templates c++11

13
推荐指数
5
解决办法
5017
查看次数

尝试从元组中删除最后一个类型失败

我正在尝试删除元组的最后一个元素.当我在元组中只有一个元素要移除时,它可以工作.但是当我不止一个时,事情就出错了.我不明白为什么这不起作用.这些是我得到的错误:

prog.cpp:在函数' int main()':
prog.cpp:24:22:错误:不完整类型' remove_last<std::tuple<int, int> >'用于嵌套名称说明符
prog.cpp:24:22:错误:不完整类型' remove_last<std::tuple<int, int> >'用于嵌套名称说明符
prog.cpp :24:70:错误:模板参数1无效

#include <tuple>
#include <type_traits>

template <class T>
struct remove_last;

template <class T>
struct remove_last<std::tuple<T>>
{
    using type = std::tuple<>;
};

template <class... Args, typename T>
struct remove_last<std::tuple<Args..., T>>
{
    using type = std::tuple<Args...>;
};

int main()
{
    std::tuple<int, int> var;

    static_assert(
        std::is_same<remove_last<decltype(var)>::type,
        std::tuple<int>>::value, "Values are not the same"
    );
}
Run Code Online (Sandbox Code Playgroud)

当我在其中一个特化中使模板参数非变量时,错误消失了.但后来这变成了一个专门化,它只会处理一个有两个元素的元组 - 而不是我的目标.如何使用可变参数进行此操作?换句话说,当元组中有多个元素时,如何才能使它工作?

c++ templates variadic-templates c++11

7
推荐指数
1
解决办法
1151
查看次数

标签 统计

c++ ×3

c++11 ×3

variadic-templates ×2

c++14 ×1

gcc ×1

templates ×1