模板函数如何选择参数?

q09*_*987 6 c++ templates

#include <iostream>
#include <ostream>

template<typename T>
void Func( const T& val )
{
    std::cout << "const T& val\n";
}

void Func( const char* p )
{
    std::cout << "const char * p\n";
}

void Func( std::ostream & ( *manip )( std::ostream & ) )
{
    std::cout << "ostream\n";
}

int main()
{
    Func( std::endl );
    Func( "aaa" );
}
Run Code Online (Sandbox Code Playgroud)

观察:

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*.

问题>这些正确的论据吗?

谢谢

Ker*_* SB 8

std::endl它本身就是一个函数模板,因此Func除非您实际指定了一个函数,否则不能使用模板参数推导.以下应该有效:

Func(static_cast<std::ostream&(&)(std::ostream&)>(std::endl));
Run Code Online (Sandbox Code Playgroud)

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

Func(std::endl<char, std::char_traits<char>>);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以提供模板参数:`Func(std :: endl <char,std :: char_traits <char >>)` (2认同)