为什么这些C++案例实例化不同的模板
Why these C++ cases instantiate different templates
>我正在尝试编写一些功能,我需要保存不同的函数,然后提取它们的参数类型。所以我使用函数签名作为模板参数。但我得到了一些意想不到的结果。代码如下:
#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)
的专业化。
void(void)
与void()
完全相同 - 第二个void
是可选的,没有区别。
这就是使用第一个没有参数的模板的原因。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞