簡略化された SI 単位を格納するには、次のテンプレートを検討してください。
template < int Mass, int Length, int Time >
class TUnit
{
public:
// Used type.
typedef float DataType;
.....
}
たとえば、SI 単位の「長さ」は次のように定義されます。
typedef TUnit< 0, 1, 0 > Length;
DataTypes を TUnits に変換するグローバル ジェネリック関数が存在します。
template < int Mass, int Length, int Time >
TUnit< Mass, Length, Time > convert( const typename TUnit< Mass, Length, Time >::DataType& src );
また、[km] から [m] への暗黙的な変換などを使用して、float を長さに変換する特殊なバージョンがあります。
template < >
Tools::DataTypes::Length convert( const Tools::DataTypes::Length::DataType& src );
float を length に変換してみましょう:
float f = 1.0;
Length l = ::convert( f )
現在、VC2012 はエラー コードでコンパイルに失敗します。
error C2783: could not deduce template argument for 'Mass'
could not deduce template argument for 'Length'
could not deduce template argument for 'Time'
これを解決するために、コードを次のように変更しました。
float f = 1.0;
Length l = ::convert< 0, 1, 0 >( f )
いいですが、これは私が望むものではありません:)私の好みの構文は次のとおりです。
float f = 1.0;
Length l = ::convert< Length >( f )
ジェネリック テンプレート関数のシグネチャを次のように変更する必要があると思います。
template < TUnit< int Mass, int Length, int Time > >
TUnit< Mass, Length, Time > convert( const typename TUnit< Mass, Length, Time >::DataType& src );
しかしもちろん、この構文は間違っています。これを解決するためのヒントはありますか?