C++中如何编写包含多个参数的模板

C++中如何编写包含多个参数的模板

模板参数列表包含多个参数,参数之间用逗号分隔。因此,如果要声明一个泛型类用于存储两个
类型可能不同的对象,可以使用如下所示的代码(这个模板类包含两个模板参数):

template <typename T1, typename T2>
class HoldsPair
{
private:
T1 value1;
T2 value2;
public:
// Constructor that initializes member variables
HoldsPair (const T1& val1, const T2& val2)
{
value1 = val1;
value2 = val2;
};
// ... Other member functions
};

在这里,类 HoldsPair 接受两个模板参数,参数名分别为 T1 和 T2。可使用这个类来存储两个类型
相同或不同的对象,如下所示:

// A template instantiation that pairs an int with a double
HoldsPair <int, double> pairIntDouble (6, 1.99);
// A template instantiation that pairs an int with an int  

HoldsPair <int, int> pairIntDouble (6, 500);  

实例化模板类时,除使用 int 等简单类型和标准库中的类外,还可使用其他类型。您可
能使用自己定义的类来实例化模板。例如,如果在程序清单 9.1 中添加定义模板类
HoldVarTypeT 的代码,就可在 main()中使用 Human 类来实例化这个模板,如下所示:
HoldVarTypeT holdHuman;
holdHuman.SetValue(firstMan);
holdHuman.GetValue().IntroduceSelf();

但是,从C++14开始,你可以通过在萃取机的名称后面附加_t并省略typename和::type来简化其使用方法(详见第40页的2.8节)

std::common_type_t<T1,T2>   // equivalent since C++14(等价定义,从C++14起)

The way std::common_type<> is implemented uses some tricky template programming, which is discussed in Section 26.5.2 on page 622. Internally, it chooses the resulting type according to the language rules of operator ?: or specializations for specific types. Thus, both ::max(4, 7.2) and ::max(7.2, 4) yield the same value 7.2 of type double. Note that std::common_type<>also decays. See Section D.5 on page 732 for details.

std::common_type<>的实现中使用了一些模板编程技巧,这会第622页的26.5.2节中进行讨论。在内部,它根据运算符“?:”的一些语言规则或具体类的特化来选择结果的类型。因此,不管是::max(4, 7.2)还是::max(7.2, 4)都会产生相同的浮点型数值7.2。注意,std::common_type<>也是一个退化类型。有关详细信息,请参考第732页的D.5节。

点击这里进行学习:零声学院C/C++服务器课程

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值