gpt4 book ai didi

c++ - 当模板类的特化允许使用比声明的更多的模板参数时?

转载 作者:行者123 更新时间:2023-12-01 23:27:47 25 4
gpt4 key购买 nike

代码非常简洁明了( YATC 表示 yet another template class :) )

template<typename T1, typename T2>
class YATC; /*declaration*/

template<typename T1>
class YATC<T1,T1> {};

template<typename T1, typename T2, typename T3>
class YATC<T1, YATC<T2, T3>> {};

int main()
{
YATC<int, YATC<int, double>> yatc;
return 0;
}

这个黑魔法看起来让我很不安。

  • 我将该类声明为模板类有两个模板参数 T1 , T2 ;

  • 我曾预计我可以进行特化 YATC类基于这样的想法,即我可以仅在两个模板参数上指定类的定义

  • 我发现实际上我可以使用无限模板参数进行特化,例如 typename T1, typename T2, typename T3但有一些有趣的限制:

  • 我不能使用 std::common_type_t<T1, T2>作为 YATC 的第二个参数特化。编译器抛出一个错误 T2不用于 YATC的专业;

  • 但是,我可以使用它们对接收这些参数(如 YATC<T2, T3> )的某些模板类的实例使用特化;

  • 但是!我仍然无法用 YATC<int, int, double> 实例化类, 只有 YATC<int, YATC<int, double>> ;

为什么这样的声明仍然有效,但为什么我不能实例化类 YATC<int, int, double>

最佳答案

I've expected that I can make specializations for YATC class based on idea that I can specificate definition of the class on two template arguments only;

这是正确的。

I've found out that actually I can make specialization using infinite template arguments like typename T1, typename T2, typename T3 but with some interesting restrictions:

是的...但仍然是YACT只有两个模板参数

参加你的第二个专业

template<typename T1, typename T2, typename T3>
class YATC<T1, YATC<T2, T3>> {};

您使用了三个模板参数但是 YACT只接收两个模板参数:

  1. T1
  2. YACT<T2, T3>

第二个比较复杂,用YACT表示本身和特化的几个模板参数,但是YACT<T2, T2>保留单个模板参数,来自 YACT观点。

实质上,声明

template<typename T1, typename T2>
class YATC;

您声明 YACT恰好收到两种类型;没有什么可以禁止您以非常非常复杂的方式构造您的类型

//                1                                  2
//...vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv..vvvvvvvvvvvvvvvvvvvvvvvvv
YACT<std::tuple<YACT<int, long>>, char>, std::vector<std::string>>> foo;

并声明YACT使用大量模板参数(不仅是类型,还有值和模板模板)的特化,来表达这对 YACT类型参数。但是YACT必须接收exaclty 两种类型的参数。很复杂,但恰好是两个。

I still cannot insatiate the class with YATC<int, int, double>, only YATC<int, YATC<int, double>>;

没错。

因为

//    1    2      3
// ..VVV..VVV..VVVVVV
YATC<int, int, double>

您将三种 类型传递给YACT , 但是用

//    1           2
// ..VVV..VVVVVVVVVVVVVVVVV
YATC<int, YATC<int, double>>

您将两种 类型传递给YACT (YACT<int, double> 是单一类型)。

关于c++ - 当模板类的特化允许使用比声明的更多的模板参数时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66931298/

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