模板特化中的默认参数参数

Default argument parameter in template specialization

template<typename T> void printf_t(const T&, char='\n');
template<>  void  printf_t(const  int&,     char);

void (*pi)(const int&,  char) = printf_t<int>;

int main()
{
     int a;
     scanf("%d", &a);
     pi(a);

     return 0;
}

我怎样才能使这段代码起作用?我想在此 template<int> 专业化中使用 char 参数默认值,但编译器说调用函数 pi 的参数太少(它期望 char)。以下代码也给出错误:

template<typename T> void printf_t(const T&, char);
template<>  void  printf_t(const  int&,     char='\n');

void (*pi)(const int&,  char) = printf_t<int>;

int main()
{
     int a;
     scanf("%d", &a);
     pi(a);

     return 0;
}

错误:

g++     template.cpp   -o template
template.cpp:55:54: error: default argument specified in explicit specialization [-fpermissive]
55 | template<>  void  printf_t(const  int&,     char='\n');
  |

当然我已经定义了printf_t<int>,但是它的body现在已经无关紧要了。

函数指针不能使用默认参数。此外,函数的默认值应分配给参数类型的参数。

template<int>  void  printf_t(const  int& a,     char n=  '\n')
{
    //implementation
}

How can I make this code work ?

你不能。函数指针不能采用默认参数。但是,您可以通过将调用包装到函数或 lambda 中或使用 std::bind:

来解决它
     auto pi = std::bind(printf_t<int>, std::placeholders::_1, '\n');
     pi(a);

使用 lambda:

     auto pi = [](const int& a) {
         printf_t<int>(a);
     };
     pi(a);

只需将其包装到函数调用中即可:

    void pi(const int& a)
    {
        printf_t<int>(a);
    }