在C ++中将类型从参数转换为模板

时间:2012-09-29 09:30:32

标签: c++ templates macros

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

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

重构后,上面的内容写成

x = function<double>(y);

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

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

希望只有当实际的参数个数与其定义匹配时才会使用该宏,但这会导致编译错误。

2 个答案:

答案 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)