gpt4 book ai didi

c++ - 类的可变参数模板部分特化以限制模板参数的类型

转载 作者:太空狗 更新时间:2023-10-29 20:02:11 26 4
gpt4 key购买 nike

我有一个类Foo这需要有可变数量的模板参数,但这些参数需要是某种通用类型,而不是完全任意的。例如

template < int I, typename T> struct Arg;
using type1 = Foo<Arg<3, double>>;
using type2 = Foo<Arg<1, int>, Arg<7, float>, Arg<1, int>>;

我想知道实现此目标的最佳方法是什么。我想我需要先从一个简单的可变参数模板开始

template < typename ...T >
class Foo;

从那里,我可以遵循递归之路

template < int I, typename T, typename ...Others>
template Foo<Arg<I, T>, Others...>
{
...
};

但是读this answer另一个问题让我想知道我对可变参数模板的了解以及有时如何避免递归。

我的问题是,模板参数预期采用相对严格的格式这一事实是否支持 Foo 的部分特化?这不会是递归的,并且会有效地处理所有 Foo形式为 Foo<Arg<...>,Arg<...>,...> 的小号?

最佳答案

这个有效:

#include <iostream>

template <int i, typename T> struct Arg;

template <typename ...T>
class Foo;

template <int ...Is, typename ...Ts>
class Foo<Arg<Is, Ts>...>
{
public:
static constexpr unsigned int N = sizeof...(Is);
};

int main()
{
using type2 = Foo<Arg<1, int>, Arg<7, float>, Arg<1, int>>;
std::cout << type2::N << "\n";
}

尽管以这种形式使用模板参数可能容易也可能不方便,这取决于你想用它们做什么。

关于c++ - 类的可变参数模板部分特化以限制模板参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45130817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com