Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板推导:为什么函数指针模板定义为常量和/或引用时不匹配? 问题后,我尝试写一个C++ 98兼容的方法来打印任何函数指针。p> 为此,我使用了一个假C++变量模板,即写上所有函数定义的N个参数。但是,我的伪变量仅适用于具有0个参数的函数指针,如下一个示例所示: 包括 样板 std::ostream和操作员_C++_C++11_Pointers_Templates_C++98 - Fatal编程技术网

模板推导:为什么函数指针模板定义为常量和/或引用时不匹配? 问题后,我尝试写一个C++ 98兼容的方法来打印任何函数指针。p> 为此,我使用了一个假C++变量模板,即写上所有函数定义的N个参数。但是,我的伪变量仅适用于具有0个参数的函数指针,如下一个示例所示: 包括 样板 std::ostream和操作员

模板推导:为什么函数指针模板定义为常量和/或引用时不匹配? 问题后,我尝试写一个C++ 98兼容的方法来打印任何函数指针。p> 为此,我使用了一个假C++变量模板,即写上所有函数定义的N个参数。但是,我的伪变量仅适用于具有0个参数的函数指针,如下一个示例所示: 包括 样板 std::ostream和操作员,c++,c++11,pointers,templates,c++98,C++,C++11,Pointers,Templates,C++98,这不起作用,因为没有Return和T0类型,Return*const t&与void*int完全匹配 另一方面,重写不在关联命名空间中的运算符是不好的,因为它非常脆弱。而且你不允许覆盖std中的运算符。所以这个计划很糟糕。因为它们是不同的类型?不知道为什么你会对double*double与double*constdouble不匹配感到困惑&你能解释一下为什么这种行为不是你所期望的吗?很明显,没有返回类型和T0,这样返回*const t0&是双*double。我不希望这种行为,因为当我在构建模板函

这不起作用,因为没有Return和T0类型,Return*const t&与void*int完全匹配


另一方面,重写不在关联命名空间中的运算符是不好的,因为它非常脆弱。而且你不允许覆盖std中的运算符。所以这个计划很糟糕。

因为它们是不同的类型?不知道为什么你会对double*double与double*constdouble不匹配感到困惑&你能解释一下为什么这种行为不是你所期望的吗?很明显,没有返回类型和T0,这样返回*const t0&是双*double。我不希望这种行为,因为当我在构建模板函数时,最一般的描述它的参数的方式是Cnst类型和ARG,在新版本的C++中,我可以使用const类型& & ARG完美地转发。而在这里,使其工作的唯一方法是使用arg类型。仅使用此签名,它就接受任何其他函数指针类型作为常量类型arg,与参数传递相反。@用户可能对模板的工作方式有误解。模板参数将被显式地或以某种方式推导出的某种类型所替代,然后调用该函数,就好像它是具有替代参数的非模板函数一样。如果要为函数调用运算符orbtw提供模板参数。类型arg作为函数参数比常量类型arg或类型arg更通用。您可以显式地为type指定任何类型(无论是否为reference),因此可以使用类型arg获取任何参数类型,但是使用const type&arg,您只能将const引用作为参数类型获取,即使您尝试显式地指定类型也是如此。只是类型arg的引用类型从来不会自动推导出来,而且它更多的是将参数作为泛型代码中的引用,特别是如果您不知道所涉及的类型是否可以复制/移动。当您说不允许覆盖std中的运算符时,您的意思是std::ostream&operator@user,除了一些模板专门化之外,您不允许在命名空间std中放置任何内容。我的意思是名称空间std{std::ostream&operator@user命名空间A{struct Foo{};std::ostream&运算符
template<typename Return, typename T0>
std::ostream& operator <<(std::ostream& os, Return(*pointer)( const T0& t0 ) ) {
  return os << (void*) pointer;
}
void f(int) {}
os << f;