const char* s1 = "teststirg";
const char s2[] = "teststirg";
s1が「char*」、s2が「char []」であることをメソッドに教えてもらいたいのですが、メソッドの書き方を教えてください。
テンプレートを使用する:
template<typename T, unsigned int SIZE>
bool IsArray (T (&a)[SIZE]) { return true; }
template<typename T>
bool IsArray (T *p) { return false; }
これは実行時に評価されます。
使用法:
if(IsArray(s1))
...
if(IsArray(s2))
...
興味があれば、コンパイル時としてこれを教えてくれるいくつかの高度なテクニックを使うことができます。
編集:
typedef char (&yes)[2];
template<typename T, unsigned int SIZE>
yes IsArray (T (&a)[SIZE]);
template<typename T>
char IsArray (T *p);
使用法:
if(sizeof(IsArray(s1)) == sizeof(yes))
...
if(sizeof(IsArray(s2)) == sizeof(yes))
...
元の定義にアクセスできる場合は、をtypeid
使用できます(ただし、何のために、私にはわかりません)。元の定義にアクセスできない場合...がchar*
別の定義から初期化されたのかchar*
、配列から初期化されたのかを知る方法はありません。
上記のコンテキスト(つまり、宣言があるのと同じメソッド内)では、
/*1*/ s1[0]='\0';
/*2*/ s2=s1;
/*3 Only This is valid*/ s1=s2;
/*4*/ s2[0]='\0';
コンパイラはステップ1、2、4の通過を許可しませんが、ステップ3は成功します。これは、変数の性質を明確に示しています。さて、それを決定するメソッド(関数呼び出し)に関しては、とにかくメソッドシグネチャに定義を持たなければならないので、このメソッドの目的/有用性/可能性はわかりません。
determiner (const char* s1,const char *const s2)
シグニチャにはすでに定義があります。このユースケースを取得するには、コンパイラをバイパスする必要があります。申し訳ありませんが、要件が正しくない場合。