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

1つの問題は、の定義です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 に答える