#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" );
}
观察:
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>>);
关于c++ - 模板函数如何选择参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142992/