gpt4 book ai didi

c++ - 为什么这些 C++ 案例实例化不同的模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:53 25 4
gpt4 key购买 nike

我正在尝试编写一些功能,我需要在其中保存不同的函数,然后提取它们的参数类型。所以我使用函数签名作为模板参数。但是我得到了一些意想不到的结果。这是代码:

#include <functional>
#include <iostream>

template <class T>
struct foo
{
foo()
{
std::cout << "class T" << std::endl;
}
};

template <class Ret, class Arg>
struct foo<Ret(Arg)>
{
foo()
{
std::cout << "Ret(Arg)" << std::endl;
}
};

template <class T>
void save(std::function<T>)
{
new foo<T>();
}

int main(int argc, char* argv[])
{
std::function<void(void)> someFoo;
save(someFoo);
return 0;
}

所以如果变量someFoo是类型为 void(void) 的函数,它实例化第一个模板,foo<T> .但是如果我把它改成 void(int) ,比我得到所需的专用模板实例化。这是为什么?

最佳答案

在 C++ 中,有一个 void 参数实际上等同于根本没有参数(顺便说一句,这与 C 中不同)。所以它会匹配 Ret() 的特化,但它不能匹配 Ret(Arg) 的特化。

关于c++ - 为什么这些 C++ 案例实例化不同的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29941760/

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