gpt4 book ai didi

c++ - 基于参数值的模板重载

转载 作者:太空狗 更新时间:2023-10-29 20:54:27 25 4
gpt4 key购买 nike

我想做的是能够根据参数的值对同一模板类进行不同的声明,如下所示:

// Enable if X == 2
template <int X, int W, typename Y,
typename A = int, typename B = int> struct Z {};

// Enable if X != 2
template <int X, typename Y,
typename A = int, typename B = int> struct Z {};

我可以从这样的事情开始:

template <int X, int W, typename Y, typename A = int, typename B = int, 
typename = std::enable_if_t<X == 2>> struct Z {};
template <int X, typename Y, typename A = int, typename B = int,
typename = std::enable_if_t<X != 2>> struct Z {};

它的问题是,可以理解的是,它已经用不同数量的参数重新声明了。

可变参数模板功能可以派上用场,但不幸的是,它只支持类型而不支持文字,就像在本例中一样。

template <typename... Args> struct Z {};
template <int X, int W, typename Y,
typename A = int typename B = int> struct Z<X, W, Y> {};

type/value mismatch -> expected a type, got 'X/W'

有人对此有解决方案吗?

编辑

抱歉我之前没有提到,但不幸的是我不能改变参数的顺序,因为 Y 之后的其他参数有默认值。

最佳答案

你说你想按照你在这里的评论说的去做:

// Enable if X == 2
template <int X, int W, typename Y, typename A=int, typename B=int>
struct Z {};

// Enable if X != 2
template <int X, typename Y, typename A=int, typename B=int>
struct Z {};

显然,您希望在 X !=2 时不使用第二个模板参数。 .您可以在没有名称的情况下定义它。

部分特化可用于进行选择:

// PRIMARY TEMPLATE: Used if X != 2
template <int X, int, typename Y, typename A=int, typename B=int>
//^^ see here
struct Z {};

// PARTIAL SPECIALIZATION: Used if X == 2
template <int W, typename Y, typename A, typename B>
struct Z<2, W, Y, A, B> {};

EDIT 1 of 2: (根据您的评论)

I want to be able to use the structure Z with only two parameters (if X!=2): Z<3, int>

您将不得不重新排序模板并在主模板中使用默认参数

// PRIMARY TEMPLATE: Used if X != 2
template <int X, typename Y, int=0, typename A=int, typename B=int>
//^^ see here
struct Z {};

// PARTIAL SPECIALIZATION: Used if X == 2
template <typename Y, int W, typename A, typename B>
struct Z<2, Y, W> {};

您可以用作:

Z<2, int> z;
Z<3, int, 5> z3;

EDIT 2 of 2: (对您的问题进行编辑和评论)

换句话说:

I want to be able to do Z<3, int> without reordering my template parameters

你只能做类似 Z<3, int> 的事情或 Z<2, int, ...>如果第二个模板参数是类型 并且其余参数是默认。不幸的是,这不是你的情况。如果这真的是您的问题,那么您就陷入了死胡同。

关于c++ - 基于参数值的模板重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39067853/

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