gpt4 book ai didi

c++ - 模板化成员函数的语法

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

考虑以下代码:

template <typename Datatype>
class MyClass
{
void doStuff();

template <typename AnotherDatatype>
void doTemplateStuff(AnotherDatatype Argument);
};

template <typename Datatype>
void MyClass<Datatype>::doStuff()
{
// ...
}

template <typename Datatype>
template <typename AnotherDatatype>
void MyClass<Datatype>::doTemplateStuff(AnotherDatatype Argument)
{
// ...
}

第二个成员函数 doTemplateStuff 的实现如果我这样压缩将无法编译:

template <typename Datatype, typename AnotherDatatype>
void MyClass<Datatype>::doTemplateStuff(AnotherDatatype Argument)
{
// ...
}

这是为什么?用逗号分隔模板信息不应该与将每个 typename 放在自己的行上具有相同的效果吗?还是有一些我不知道的细微差别...?

(此外,如果有人能想到更好的标题,请告诉我。)

最佳答案

这是一个很好的问题。我不知道标准委员会决定以这种方式设计模板的具体原因,但我认为这是对 lambda 演算和类型理论的回调。从数学上讲,任何接受两个参数并返回一个值的函数与接受单个参数然后返回接受另一个参数然后返回值的函数之间存在同构。例如:

λx。 λy。 x+y

与(但不等同于)同构

λ(x, y)。 x+y

其中 (x, y) 是表示 x 和 y 对的单个对象。

对于 C++ 成员函数模板,C++ 选择使用这些系统中的第一个。您必须为最外层函数指定所有参数,然后分别为最内层函数指定所有参数。从数学上讲,这相当于在一个参数列表中同时指定所有参数,但 C++ 没有选择这样做。

现在,一个非常好的问题是为什么他们没有这样做。我不完全确定其基本原理,但如果我不得不猜测的话,那是因为与模板特化的奇怪交互。如果我能想到具体的事情,我会更新这篇文章。

关于c++ - 模板化成员函数的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4731372/

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