gpt4 book ai didi

c++ - 关于C++模板的问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:52:04 25 4
gpt4 key购买 nike

我知道 C++ 中模板的基础知识,但我仍在学习它。我对以下代码有疑问:

#include <iostream>

using namespace std;

class PNG {
public:
static void draw() {
cout<<"PNG drawing"<<endl;
}
};

template <typename Image>
void draw() {
Image::draw();
}


int main() {

draw<PNG>();
}

函数draw() ,我传递类型 Image给它,它将使用 draw() Image 的方法.

template <typename Image>
void draw() {
Image::draw();
}

在这里,我通过 Image并想使用 draw() Image 内部的方法, 但模板函数 draw()没有参数。所以我的问题是,如果我调用这个模板函数 draw()main这样:draw<PNG>();允许吗?以及模板功能如何draw()知道PNG是一个类,类的成员函数如何draw()叫什么?

最佳答案

你的第一个问题

if I call this template function draw() in main in this way: draw(); is it allowed?

如您所知,编译器无法自行推断您的意思是draw<PNG>如果没有可从中找出的函数参数。

所以,你必须写(就像你已经写的那样):

int main() {
draw<PNG>();
}

这里不能省略模板参数。

你的第二个问题

and how the template function draw() knows the PNG is a class, and how the class member function draw() is called?

当函数模板(A)用参数PNG实例化时,生成的函数体看起来像 (B):

// A:

template <typename Image>
void draw() {
Image::draw();
}

// B:

PNG::draw();

解析器知道,要让它工作,PNG必须是命名空间或类/结构。否则,函数将不会编译。

假设你调用 draw<int>()相反,例如,您的代码将尝试调用 int::draw() , 这是不可能的。

现在,由于 SFINAE(查找它!),您不会收到损坏的 int::draw() 的编译错误称呼;这个特定的实例将被简单地禁止存在。您可能会被告知“没有匹配函数 draw() ”,因为 — 排除被禁止的实例化 — 函数不可能重载 draw它可以选择使用。

关于c++ - 关于C++模板的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6257031/

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