0

我正在重构一些使用自己的类型处理系统的旧代码,该系统为用作参数的类型提供了一个特殊的宏:

x = function(TYPE(double), y);

重构之后,上面写成

x = function<double>(y);

有没有办法(使用宏或重载函数)来保持旧样式也能正常工作,提供向后兼容性?我试过这样的事情:

#define TYPE(x) (x)
#define function(x, y) function<x>(y)

希望宏仅在实际参数数量与其定义匹配时使用,但这会导致编译错误。

4

2 回答 2

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 );
}
于 2012-09-29T09:48:24.770 回答
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)
于 2012-09-29T10:11:03.710 回答