Xét đoạn mã sau:decltype (tự động), loại trả về theo sau và sfinae: chúng ta có thể trộn chúng không?
auto f() -> decltype(auto) { /* do whatever you want here */ }
int main() { f(); }
Các kiểu trả về là suy luận và decltype(auto)
được sử dụng như trailing kiểu trả về.
Đoạn code dưới đây là một chút thay đổi (trên thực tế, sfinae'd) phiên bản:
struct S { static void f() {} };
struct T {};
template<typename U>
auto f(int) -> decltype(U::f(), void()) {
// do whatever you want here
}
template<typename>
auto f(char) -> decltype(auto) {
// do whatever you want here
}
int main() {
f<S>(0);
f<T>(0);
}
Nếu bạn đi trong kỳ thi chức năng này:
template<typename U>
auto f(int) -> decltype(U::f(), void()) {
// do whatever you want here
}
Câu hỏi đặt ra là: là nó có thể sử dụng kiểu trả về đuôi để làm sfinae và vẫn có kiểu trả về được suy ra?
Ý tôi là một cái gì đó giống như mã dưới đây (đó không làm việc, tất nhiên):
template<typename U>
auto f(int) -> decltype(U::f(), auto) {
// do whatever you want here
}
Lưu ý: Tôi không tìm kiếm các phương pháp thay thế liên quan đến các thông số mẫu, tôi biết chúng và tôi m chỉ tò mò muốn biết nếu này là một giải pháp khả thi.
Đừng nghĩ rằng có thể nhưng bạn muốn loại được suy ra là 'tự động' hoặc là' decltype (tự động) '? – Holt
Đừng nghĩ rằng có bất cứ điều gì bạn có thể làm ở đây. Các loại trả lại cố ý không có nghĩa là SFINAE. – Xeo
@ Holt Câu hỏi hay, tôi đã nói 'decltype (tự động) 'như trong ví dụ đầu tiên, nhưng nếu bạn biết làm thế nào để có nó suy ra như' tự động' nó có thể là một câu trả lời tốt là tốt. – skypjack