私は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
と表示されます。
あなたは '文字列を使用することはできません何らかの理由:: c_str'?あなたの配列に 'vector'を使用しますか? –
あなたは 'templateを探しているかもしれません。 void copyWithBoundaryCheck(char(&destination)[N]、...);'私はあなたのオーバーロードゲームの目的を十分に理解していません。 1つ目は、 'copyWithBoundaryCheck'の最初のオーバーロードは、' T'を推定できないため、決して過負荷解決では実行可能ではありません。 –
これは、あまりにも多くの推測のように見えます。これは、C++で頻繁に行われるように、あなたを非常に遠ざけるものではありません。配列がC++でどのように動作するかを確認する必要があります。 –