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)
取消注释行/*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.
重载你的函数:
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)
将其转换为方法应该很容易。
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |