2016-11-06 7 views
2

私は次のように非常に単純な印刷行列機能を持っていると言うことができます:私は長さ4を言うことができますの1次元の行列であることをそれを正しく割り当てられると思うことができます(C/C++のint変数とlong int変数の両方で機能する関数を定義する方法はありますか?

void print_mat_N_1(int rows, int *matrix) { 
    for (int r = 0; r < rows; ++r) { 
     cout << matrix[r]; 
     cout << endl; 
    } 
    cout << endl; 
} 

この機能は私のint *C 1次元マトリックス上で動作することができます、私はそれを知っている行列ではなくポインタであると主張しないでください)、結果を出力します。

long int *Cについては期待通りにに対応していません。 私の解決策は次のように同じ名前の関数を複製する(作業している)であった:

void print_mat_N_1(int rows, long int *matrix) { 
    for (int r = 0; r < rows; ++r) { 
     cout << matrix[r]; 
     cout << endl; 
    } 
    cout << endl; 
} 

これは、最高の修正やないですか?私はさまざまな種類の異なる同じ名前を持って、float、double、unsignedなどと言うことができます。

この「欲しい」も議論することができます。同名の異なるタイプで動作できるこの機能を持つことは悪い考えですか?私はちょうど異なる名前でそれらを定義する必要がありますか?

+3

これはCコードではありません。 Cには 'cout <<'はありません – UnholySheep

+3

テンプレート関数を使用しますか? –

答えて

4

ユーザーが間違った型を拾うことができないように、関数テンプレートとstatic_assertタイプを使用します。

template<typename T> 
void print_mat_N_1(int rows, T *matrix) { 
    static_assert(std::is_same<T, int>::value or std::is_same<T, long int>::value, "!"); 

    for (int r = 0; r < rows; ++r) { 
     cout << matrix[r]; 
     cout << endl; 
    } 

    cout << endl; 
} 

希望する場合はstd::enable_ifと似たような操作を行うことができます。

template<typename T> 
std::enable_if_t<std::is_same<T, int>::value or std::is_same<T, long int>::value> 
print_mat_N_1(int rows, T *matrix) { 
    for (int r = 0; r < rows; ++r) { 
     cout << matrix[r]; 
     cout << endl; 
    } 

    cout << endl; 
} 
2

これはまさにテンプレートの対象です。

template <typename T> 
void print_mat_N(int rows, T *matrix) { 
    for (int r = 0; r < rows; ++r) { 
     cout << matrix[r]; 
     cout << endl; 
    } 
    cout << endl 
} 
関連する問題