現在、テンプレートの汎用タイプを文字列リテラルと同様にstd::sting
に制限する方法について考えています。したがって、私は推測された型をstd::is_same
を使って目的の型と比較します。 std::string
の場合はすぐに動作します。 char const配列を意味する文字列リテラルでは、型にstd::decay
を使用し、その結果を型char const *
と比較した場合にのみ動作します。推測される型を私が思うものと直接比較すると、is_same
は、次のコード例に示すようにfalseを返します。テンプレート引数文字列からの引き出し
template <class TYPE>
void function(TYPE&& parameter)
{
//this doesn't work as expected
std::cout << typeid(TYPE).name() << " : " << typeid(char const [5]).name() << std::endl;
std::cout << std::is_same<char const [5], TYPE>::value << std::endl;
//this works as expected
std::cout << typeid(std::decay_t<TYPE>).name() << " : " << typeid(char const *).name() << std::endl;
std::cout << std::is_same<char const *, std::decay_t<TYPE>>::value << std::endl;
}
int main(int argc, char** argv)
{
function("name");
return 0;
}
生成される出力は以下の通りです:今
char const [5] : char const [5]
0
char const * __ptr64 : char const * __ptr64
1
、私は疑問に思ってすることは型が同一であるように見えるにもかかわらず、最初のケースでは、なぜis_same
リターンはfalseです。
私が思いつくことができる唯一の可能な説明は、std::is_same
のように、std::decay
に似た変換が(関数呼び出しのような)型に適用されているということです。しかし、やはりこの変換はもう一方の型にも起こり、同じ結果をもたらし、その結果、等価になります。
C++ 17まで待ってから、テンプレートを書いて 'std :: string_view'を使用してください。 –
'TYPE'から参照を削除してみてください。文字列リテラルは左辺値です。 –
ありがとうございます、あなたは正しいです。私はそれを知らなかった。行を 'std :: is_same> :: value'に変更すると、結果は等しくなります。文字列リテラルが左辺値とみなされるのはなぜですか?代わりにintリテラルであれば、それはrvalueと見なされますね。そして、これを受け入れられる答えにすることはできますか? –
user1488118