c++ - 模板函数如何选择参数?

标签 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" );
}

观察:

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/

相关文章:

c++ - 使用 for_each 标准或 boost 工具优化循环

c++ - 在与多个字段进行比较时提供严格的排序

c++ - 与可变参数模板一起使用的基类列表

模板类的实例化对象上的 C++ 模板元函数

C++ 模板 - 完整指南 : Wording of footnote about decltype and return type

c++ - 是否可以在 C++ 中声明两个变量 For-Each 循环?

c++ - 成员函数指针的类型推导

php - 如何修改Joomla文章的布局?

python - 如何在 jinja2 模板中重复一个 block ?

c++ - 用作模板参数以比较 double 值的类型