2016-09-09 11 views
0

私はC APIを使用するライブラリでプロジェクトで作業しているため、部分char [] [std::stringのみを使用することもできます]を使用する必要があります。境界チェックを持つchar []の安全化されたテンプレート

どのようにこれまで、私はテンプレートを使用してこの問題をキャッチしようとしていた固定サイズchar []に長すぎるchar *変数をコピーする際の問題を回避するためです。

しかし、残念なことに私は専門性に悩まされています。プロジェクトでは、私たち変数は常にタイプchar [fixed-value]のであり、それはchar *てはならないことをとることができます。したがって、実際にはchar *の割り当てサイズのサイズを確実に決定する信頼できる方法がないため、これは重要です。

これは私がそこまでしようとしたものです:

Wrong parameter <-- output for copyWithBoundaryCheck(wrongPtr, source, 10); 
Wrong parameter <-- output for copyWithBoundaryCheck(destination, source, sizeof(destination)); 

copyWithBoundaryCheck(destination, source, sizeof(destination));ために、私は出力Correct parameterを期待していたが、私はいつもWrong parameterを受け取る:

#include <stdio.h> 

template <typename T> 
void copyWithBoundaryCheck(char destination [], char * source, int maximalSize) 
{ 
    printf("Correct parameter\n"); 
}; 

template <typename T> 
void copyWithBoundaryCheck(T, char * source, int maximalSize) 
{ 
    printf("Wrong parameter\n"); 
}; 

int main() 
{ 
    char * source = (char *) "Source"; 
    char * wrongPtr = (char *) malloc(20); 
    char destination [20]; 

    copyWithBoundaryCheck(wrongPtr, source, 10); 
    copyWithBoundaryCheck(destination, source, sizeof(destination)); 
} 

これが出力されます。

私の質問:テンプレート関数の専門copyWithBoundaryCheckにキャッチchar [numeric-value]を実装する必要がありますどのように

?私の例によると、copyWithBoundaryCheck(destination, source, sizeof(destination));Correct parameterと表示されます。

+0

あなたは '文字列を使用することはできません何らかの理由:: c_str'?あなたの配列に 'vector 'を使用しますか? –

+0

あなたは 'templateを探しているかもしれません。 void copyWithBoundaryCheck(char(&destination)[N]、...);'私はあなたのオーバーロードゲームの目的を十分に理解していません。 1つ目は、 'copyWithBoundaryCheck'の最初のオーバーロードは、' T'を推定できないため、決して過負荷解決では実行可能ではありません。 –

+0

これは、あまりにも多くの推測のように見えます。これは、C++で頻繁に行われるように、あなたを非常に遠ざけるものではありません。配列がC++でどのように動作するかを確認する必要があります。 –

答えて

4

あなたは、おそらくこのような何かを探しています:

template <size_t N> 
void copyWithBoundaryCheck(char (&destination)[N]) 
{ 
    printf("Correct parameter of size %zu\n", N); 
}; 

Demo

+0

はいサー!完璧な答え!私はその間にいくつかのタイプでそれをテストすることができ、それはまさに私が探していたものです! upvotedと受け入れられる!ありがとう!私は**目的地*フィールドのサイズを提供する必要はないので、今は非常にエレガントです。これはコンパイラによって解決されます。私はこの答えが大好き! –

関連する問題