将void作为参数替换为模板化方法

Val*_* T. 6 c++ templates member-function-pointers void c++03

在我的代码中,我有一个类,它注册其他类的方法:

#include <iostream>
using namespace std;

template< typename C>
  class Reg {
  public:
    template< typename R, typename A>
      void register_f( string name, R ( C:: *method_p ) ( A)) { /*registration process*/ }

//    template< typename R>
//      void register_void_f( string name, R ( C:: *method_p ) ( void)) { /*registration process*/ }
  };

  class A {
  public:
      int f( void) { return 1; }
      void g( int x) { /* some code*/ }
  };


  int main() {
      Reg< A> r;

      r.register_f( "g", &A::g);
/*1*///  r.register_f( "f", &A::f);
/*2*///  r.register_f< int, void>( "f", &A::f);
/*3*///  r.register_void_f< int>( "f", &A::f);

      return 0;
  }
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/X8PNLC

取消注释行/*2*/给我一个错误:

模板参数扣除/替换失败:

代替'template void register_f(std :: string,R(C ::*)(A))[用R = R; A = A; C = A] [R = int; A = void]':

错误:参数类型无效'void'

行/*1 /与/ 2*/相同,但没有提供如此丰富的错误消息.

我理解为了解决问题,我可以使用方法register_void_f,但我不想这样做,因为register_f是我最终API的一部分.

问题>如何在不引入register_void_f的情况下修复编译错误?

我有一个想法,用部分专门的register_f来解决它,但我不知道怎么做,因为在C++中你不能部分地专门化模板化方法.

PS>我不能使用C++ 11.

Yak*_*ont 2

重载你的函数:

void foo( int ) {}
double bar() { return 3.14; }

template< class R, class A >
void test(  R ( *method_p ) (A)) {  }
template< class R >
void test(  R ( *method_p ) ()) {  }

int main(){
  test(foo);
  test(bar);
}
Run Code Online (Sandbox Code Playgroud)

活生生的例子

将其转换为方法应该很容易。