我正在重构一些使用自己的类型处理系统的旧代码,该系统为一个类型提供了一个特殊的宏作为参数:
x = function(TYPE(double), y);
重构后,上面的内容写成
x = function<double>(y);
有没有办法(使用宏或重载功能)保持旧样式也能正常工作,提供向后兼容性?我试过这样的事情:
#define TYPE(x) (x)
#define function(x, y) function<x>(y)
希望只有当实际的参数个数与其定义匹配时才会使用该宏,但这会导致编译错误。
答案 0 :(得分:2)
template< class Type >
void function( int x ) {}
#define TYPE( t ) t()
template< class Type >
void function( Type, int x ) { function< Type >( x ); }
编辑:更一般地说,例如如果你想支持void
,你可以......
template< class Type >
void function( int ) {}
template< class Type >
struct TypeCarrier {};
#define TYPE( t ) TypeCarrier< t >()
template< class Type >
void function( TypeCarrier< Type >, int x ) { function< Type >( x ); }
int main()
{
function( TYPE( double ), 1 );
function( TYPE( void ), 2 );
}
答案 1 :(得分:0)
一个问题是您对TYPE
的定义。摆脱括号。
#define TYPE(x) x
#define function(x, y) function<x> (y)
这也是一个潜在的问题,因为模板函数与您尝试替换的函数具有相同的名称。您可能想要将其命名为不同的名称。否则新用法不受限制。
#define TYPE(x) x
#define function(x, y) some_name_other_than_function<x> (y)