2017-06-30 18 views
1

これは私がC++で口座に入金したい機能を持っていることを意味しています。この関数は、浮動小数点数、倍数、整数などを受け入れることができるはずです。これらは入力のすべての有効な形式です。C++テンプレートタイプを数字に限定する

はこのように、私は宣言:

template <typename type> 
void Deposit(type t) {...} 

今私が持っている唯一の問題はこれです:理論的には、道路の下に、このクラスのユーザーは、この関数に文字や文字列を渡すとやっての意図しない結果になる可能性がありそう。タイプを整数、浮動小数点型、倍精度、short型に制限するにはどうすればいいですか?これを関数定義内で制限して、この関数を使用してプログラミングするときに、try{...} catch(...){...}を使用するのではなく、コンパイラ/リンカのエラーが発生するようにすることは可能ですか?

+2

「t」のタイプに関係なく、正しくコンパイルすると思われる関数の中で何をしていますか? – Sneftel

+2

お金のために浮動小数点数を使用しないでください。本のバランスを取ることが不可能になります。顧客はペニーよりも上手くなります –

+1

確かに 'typedef'ではなく' typename'を意味します。 – Rakete1111

答えて

5

std::is_arithmeticは、テンプレートタイプを算術タイプ(整数または浮動小数点数)に制限するために必要なものです。メソッドを追加し、それをテスト、 - (など、加算、減算ドメインの必要な操作を含む)あなたは、あなたが適切お金で作業classを作成する必要があり、私はあなたが間違ったアプローチを取得しているかと思います

template <typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr> 
void Deposit(T t) {...} 
+1

'std :: is_arithmetic'は' bool'に対しても真であることに注意してください。これは質問にリストされている型の1つではありません。 – skypjack

4

のようにそれを使用することができますそれを印刷および/または文字列に変換し、あなたの関数だけそのタイプ受け付けるに

class Money { 
public: 
    explicit Money(double v); 
    explicit Money(int v); 
    Money(int dollars, int cents); 
... 
}; 
:種類が受け入れることができるかを制御することができます追加コンストラクタによってそう

class Money { 
    ... 
}; 

void Deposit(Money amount); 

このようにして、どのコンバージョンを実行できるかを制御できます。この特定の機能だけでなく、全体でclassを実行することもできます。それ以外の場合は、多くの機能で同じロジックを再実装する必要があります(システムにはデポジットする機能が必要になるとは思えません)。

関連する問題