Ответ 1
Фактически вы не вызываете pr
в свой код, вы передаете указатель на cout
. pr
затем преобразуется в bool
при передаче в cout
. Если вы положили cout << boolalpha
заранее, вы выведете true
вместо 1
.
EDIT:
С С++ 11 вы можете написать следующую перегрузку:
template <class RType, class ... ArgTypes>
std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...))
{
return s << "(func_ptr=" << (void*)func << ")(num_args="
<< sizeof...(ArgTypes) << ")";
}
что означает, что вызов cout << pr
будет печатать (func_ptr=<address of pr>)(num_args=0)
. Сама функция может делать то, что вы хотите, очевидно, это просто, чтобы продемонстрировать, что с помощью вариативных шаблонов С++ 11 вы можете сопоставлять указатели функций произвольной arity. Это все равно не будет работать для перегруженных функций и шаблонов функций, не указывая, какую перегрузку вы хотите (обычно с помощью трансляции).