模板函数如何选择参数

How template function chooses parameter?

本文关键字:选择 参数 何选择 函数      更新时间:2023-10-16
#include <iostream>
#include <ostream>
template<typename T>
void Func( const T& val )
{
    std::cout << "const T& valn";
}
void Func( const char* p )
{
    std::cout << "const char * pn";
}
void Func( std::ostream & ( *manip )( std::ostream & ) )
{
    std::cout << "ostreamn";
}
int main()
{
    Func( std::endl );
    Func( "aaa" );
}

观察:

1> 如果不void Func( std::ostream & ( *manip )( std::ostream & ) ),行Func( endl );会导致编译器错误。我认为问题是由于模板函数void Fun( const T& val )它只能接受一种类型的T但只能接受函数指针。

2> 没有void Func( const char* p ),线路Func( "aaa" );运行良好。我认为原因是类型T可以const char*.

问题>这些论点正确吗?

谢谢

std::endl本身就是一个函数模板,因此除非实际指定函数,否则不能对Func进行模板参数推导。以下方法应该有效:

Func(static_cast<std::ostream&(&)(std::ostream&)>(std::endl));

另一种方法(感谢@0x499602D2(是指定模板参数:

Func(std::endl<char, std::char_traits<char>>);