Tôi hiện đang suy nghĩ về cách tốt nhất hạn chế loại chung của mẫu thành std::sting
cũng như chuỗi ký tự. Do đó tôi so sánh loại suy luận với loại mong muốn sử dụng std::is_same
. Trong trường hợp của std::string
, tính năng này hoạt động ngay lập tức. Đối với chuỗi ký tự, nghĩa là mảng char const, nó chỉ hoạt động nếu tôi sử dụng std::decay
trên loại và sau đó so sánh kết quả với loại char const *
. Nếu tôi trực tiếp so sánh loại suy luận với điều tôi nghĩ, is_same
trả về false, như được minh họa bằng mã ví dụ sau.Khấu trừ đối số mẫu từ chuỗi Literal
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;
}
Sản lượng được tạo ra như sau:
char const [5] : char const [5]
0
char const * __ptr64 : char const * __ptr64
1
Bây giờ, những gì tôi đang tự hỏi là tại sao is_same
false trả trong trường hợp đầu tiên mặc dù các loại dường như giống hệt nhau.
Giải thích duy nhất mà tôi có thể đưa ra là trong hàm std::is_same
phép chuyển đổi tương tự như std::decay
được áp dụng cho loại (ví dụ: cuộc gọi hàm). Nhưng sau đó một lần nữa chuyển đổi này cũng sẽ xảy ra với loại khác, cho kết quả tương tự và do đó dẫn đến sự bình đẳng.
Đợi đến khi C++ 17 và viết mẫu của bạn để sử dụng 'std :: string_view'. –
Thử xóa tham chiếu khỏi 'TYPE'. String literals là các giá trị. –
Cảm ơn bạn, bạn đã đúng. Tôi không biết điều đó. Thay đổi dòng thành 'std :: is_same> :: giá trị' dẫn đến sự bình đẳng. Tại sao các chuỗi ký tự được coi là giá trị? Nếu nó là một chữ int thay vì nó sẽ được coi là một rvalue, phải không? Và chúng ta có thể làm cho câu trả lời này được chấp nhận không? –
user1488118