「文字、符号付き整数、符号なし整数、浮動小数点、ポインター」など、型の品質に基づいて特殊化したい関数がいくつかあります。type_traitsを使用することはこれを行う方法のようであり、次のようなコードがあります。
#include <tr1/type_traits>
#include <iostream>
template<bool, typename _Tp = void>
struct enable_if
{ };
template<typename _Tp>
struct enable_if<true, _Tp>
{
typedef _Tp type;
};
template< typename T >
inline void
foo_impl( typename enable_if< std::tr1::is_integral< T >::value, T >::type const& )
{
std::cout << "This is the function-overloaded integral implementation.\n";
}
template< typename T >
inline void
foo_impl( typename enable_if< std::tr1::is_floating_point< T >::value, T >::type const& )
{
std::cout << "This is the function-overloaded floating-point implementation.\n";
}
template< typename T >
inline void
function_overloads_foo( T const& arg )
{
foo_impl< T >( arg ); // vital to specify the template-type
}
void function_overloads_example()
{
function_overloads_foo( int() );
function_overloads_foo( float() );
}
私の実際のコードを除いて、私は、、なども持ってbar
いbaz
ますfoo
。
ただし、品質ごとにこれらすべての関数をメソッドとして1つのテンプレートクラスにグループ化したいと思いstatic
ます。これはどのように行うのが最善ですか?これが私の素朴で壊れたタグ、SFINAE、および部分的特殊化の使用の試みです。
struct IntegralTypeTag;
struct FloatingPointTypeTag;
template< typename T, typename U = void >
class Foo
{
};
template< typename T >
class Foo< T, typename enable_if< std::tr1::is_integral< T >::value, IntegralTypeTag >::type >
{
static void foo( T const& )
{
std::cout << "This is the integral partial-specialization class implementation.\n";
}
};
template< typename T >
class Foo< T, typename enable_if< std::tr1::is_floating_point< T >::value, FloatingPointTypeTag >::type >
{
static void foo( T const& )
{
std::cout << "This is the floating-point partial-specialization class implementation.\n";
}
};
template< typename T >
inline void
partial_specialization_class_foo( T const& arg )
{
Foo< T >::foo( arg );
}
void partial_specialization_class_example()
{
partial_specialization_class_foo( int() );
partial_specialization_class_foo( float() );
}
注:実際のコードでは、 static-methodsに加えてbar
、baz
などがあります。foo
参考までに、これはC++03です。
余談ですが、私は従来の方法でテンプレート関数のオーバーロードを行っていますか?