【问题标题】:What "struct seq<0, 1, 2>{}" data type meaning?“struct seq<0, 1, 2>{}”数据类型是什么意思?
【发布时间】:2023-03-19 12:43:01
【问题描述】:
    template<int... Is>
    struct seq { };

    template<int N, int... Is>
    struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };

    template<int... Is>
    struct gen_seq<0, Is...> : seq<Is...> { };

当调用gen_seq得到最终的struct seq{}类型,我看不懂“struct seq{}”数据类型的含义?这意味着一个结构包含三个数字?

【问题讨论】:

  • 请标记您正在使用的编程语言。

标签: c++ c++11 templates struct int


【解决方案1】:

Variadic template的用法,可以带任意数量的参数。您可以在这些结构的构造函数中使用__PRETTY_FUNCTION__ 检查调用堆栈。

#include <iostream>
template<int... Is>
struct seq { 
    seq(){std::cout<<__PRETTY_FUNCTION__<<std::endl;}
};

template<int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> { 
    gen_seq(){std::cout<<__PRETTY_FUNCTION__<<std::endl;}
};

template<int... Is>
struct gen_seq<0, Is...> : seq<Is...> { 
    gen_seq(){std::cout<<__PRETTY_FUNCTION__<<std::endl;}
};
int main() {  
    gen_seq<3> t;
}

输出:

seq<0, 1, 2>::seq() [Is = <0, 1, 2>]
gen_seq<0, 0, 1, 2>::gen_seq() [N = 0, Is = <0, 1, 2>]
gen_seq<1, 1, 2>::gen_seq() [N = 1, Is = <1, 2>]
gen_seq<2, 2>::gen_seq() [N = 2, Is = <2>]
gen_seq<3>::gen_seq() [N = 3, Is = <>]

【讨论】:

  • 谢谢。输出日志很清晰,很有帮助。
【解决方案2】:

它是一个包含三个数字的 type 对象。该对象没有数据成员。

它用于将模板参数包(ints)作为单个值携带,例如

template <typename UnaryOperation, typename... Ts, int... Is>
std::tuple<Ts...> tuple_for_impl(UnaryOperation op, std::tuple<Ts...> input, seq<Is...> /*unused*/) {
    return { op(std::get<Is>(input))... };
}

template <typename UnaryOperation, typename... Ts>
std::tuple<Ts...> tuple_for(UnaryOperation op, std::tuple<Ts...> input) {
    return tuple_for_impl(op, input, gen_seq<sizeof...(Ts)>{});
}

在 C++14 中,它包含在标准库中,为 std::integer_sequence

【讨论】:

  • 谢谢。在 C++11 中,上面的方法很有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2019-04-25
  • 2017-01-27
  • 2015-05-27
  • 2023-02-02
  • 1970-01-01
  • 2020-02-15
相关资源
最近更新 更多