- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi đang viết một số mã điểm đơn giản trong khi dùng thử Visual Studio 10 (Beta 2) và tôi đã sử dụng mã này khi tôi muốn SFINAE bắt đầu, nhưng có vẻ như không:
mẫu
điểm cấu trúc {
T x, y;
điểm(T x, T y): x(x), y(y) {}
};
mẫu
cấu trúc op_div {
typedef decltype(T() / U()) loại;
};
mẫu
điểm::type>
toán tử/(point const& l, point const& r) {
điểm trả về::type>(lx/rx, ly/ry);
}
mẫu
điểm::type>
toán tử/(điểm const& l, U const& r) {
điểm trả về::type>(lx / r, ly / r);
}
int chính() {
point(0, 1) / point(2, 3);
}
这给出了 error C2512: 'point
鉴于它是测试版,我对在线 comeau 编译器进行了快速完整性检查,它同意一个相同的错误,所以看起来这种行为是正确的,但我不明白为什么。
在这种情况下,一些解决方法是简单地内联 decltype(T() / U())
,给点类一个默认构造函数,或者在完整的结果表达式上使用 decltype,但是我在尝试简化一个不需要默认构造函数*的 op_div 版本的错误时遇到了这个错误,所以我宁愿修正我对 C++ 的理解,而不是只做有效的事情。
Cảm ơn!
*:原文:
mẫu
cấu trúc op_div {
static T t(); static U u();
typedef decltype(t() / u()) type;
};
这给出了 error C2784: 'point<>
, 以及 point
过载。
câu trả lời hay nhất
不能 100% 确定。看起来编译器需要实例化两个重载以确定哪个更好,但是在尝试用 T = int
实例化另一个 op_div 时和 U = point
,这会导致 SFINAE 未涵盖的错误(错误不是 op_div 在这种情况下没有类型,而是无法确定该类型)。
如果第二种类型是点 ( boost::disable_if
),您可以尝试禁用第二次重载。
此外,延迟返回类型声明(取消 op_div 结构,但取决于您的编译器支持哪些 C++0x 功能)似乎有效:
mẫu
tự động
operator/(point const& l, point const& r) -> point {
return {l.x / r.x, l.y / r.y};
}
mẫu
tự động
operator/(point const& l, U const& r) -> point {
return {l.x / r, l.y / r};
}
关于c++ - 为什么SFINAE不适用于这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606738/
Một số câu hỏi của chuyên gia C++11 Tôi đang làm việc với SFINAE và gặp phải một tình huống kỳ lạ khi g++ (4.9.2) và clang++ (3.5.0) hoạt động khác nhau. Tôi đã chuẩn bị mã mẫu sau. Xin lỗi, tôi không có
Tôi đang thử nghiệm SFINAE những ngày này và có điều gì đó làm tôi bối rối. Tại sao my_type_a không thể được khởi tạo từ my_function? lớp mẫu my_type_a {};
Tôi đang cố gắng sao chép (tôi đoán vậy) ví dụ SFINAE điển hình để xác định xem một loại có phương thức cụ thể hay không. Mã của tôi về cơ bản là mã được tìm thấy trong câu trả lời được chấp nhận của câu trả lời trước đó
Vì lý do học thuật, tôi muốn triển khai một ví dụ chọn mẫu nếu tham số mẫu không phải kiểu thỏa mãn một điều kiện nhất định. Ví dụ: tôi muốn một hàm chỉ được xác định cho số lẻ. Bạn có thể làm điều này: template struct is_odd: public st
Có cách nào để kiểm tra xem việc ghép hai gói biến thể có giống với gói biến đổi thứ ba hay không. mẫu struct ClassOne { } mẫu struct ClassTwo { } mẫu s
Tại sao đoạn mã sau không được biên dịch? Giải pháp rõ ràng nhất để bật mẫu cho các loại có thành viên cụ thể là gì? Nó cũng sẽ biên dịch nếu một biến mẫu được thay thế bằng một biểu thức được sử dụng trực tiếp để khởi tạo nó. #include mẫu constexpr boo
Mã: #include sử dụng mẫu std::nullptr_t;
Tôi có một lớp mẫu và tôi muốn có hai ctor sao chép. Một cho các loại tầm thường và một cho các loại không tầm thường. Đoạn mã sau hoạt động (sử dụng ctor sao chép): template struct MyStruct { MySt
Tôi đã cố gắng xác định một lớp trợ giúp để giúp tôi về các phương thức mẫu mà tôi muốn cung cấp cách triển khai chung cho các kiểu phức tạp và kiểu thực. Đây là những gì tôi đã thử cho đến nay: #include #include cấu trúc mẫu là
Câu hỏi này đã có câu trả lời: Chính thức, typename dùng để làm gì? [trùng lặp] (8 câu trả lời) Đã đóng cửa 3 năm trước. Tôi đang làm việc trên SFINAE bằng C++ hiện đại và tôi đang xem xét
Tôi có một std::variants chứa các đối tượng có giao diện khác nhau. Mục tiêu là gọi một số phương thức nếu đối tượng trong biến thể có nó. Tôi đang cố gắng tạo một vài công cụ trang trí mẫu và tìm cách sử dụng ít bản soạn sẵn hơn và không có macro
Tôi có một mã nhận một hàm và thực thi nó dựa trên chữ ký hàm như sau: template struct Value { int value[Num]; struct Executor { t
Tôi đã cố gắng xác định một lớp trợ giúp để giúp tôi về các phương thức mẫu mà tôi muốn cung cấp cách triển khai chung cho các kiểu phức tạp và kiểu thực. Đây là những gì tôi đã thử cho đến nay: #include #include cấu trúc mẫu là
Trong video này https://youtu.be/Vkck4EU2lOU?t=582 "Lập lịch thẻ" và SFINAE xuất hiện dưới dạng các lựa chọn thay thế, cho phép lựa chọn triển khai chức năng mẫu mong muốn. Chính xác? "Gửi nhãn" không sử dụng SFINAE?
Tôi nghĩ đoạn mã sau sẽ biên dịch vì tình trạng quá tải xung đột là SFINAEd. Nhưng trình biên dịch (GCC) cho biết: void Foo::bar(Xd) const' không thể bị quá tải. Có cách nào dễ dàng để khắc phục nó không?
#define mẫu BINDINGTEMPLATE, int> || std::is_same_v, std::string> || std::is_same_v, char>>>
SFINAE có đóng vai trò gì trong các lập luận về khái niệm không? (Có lẽ ở đây nó không được gọi là SFINAE). Ví dụ: mẫu yêu cầu std::invocable && // , void>)
Trong bài nói chuyện Lập trình siêu mẫu hiện đại: Phần phác thảo Phần I, Walter Brown thảo luận về sự tương tác của Enable_if với SFINAE theo cách riêng của ông. Vào khoảng 47:40 trong cuộc trò chuyện, anh ấy đã được hỏi một câu hỏi mà tôi không thể hiểu được
Tôi đang cố gắng thực hiện hai lần nạp chồng của cùng một hàm, được gọi là cái gì đó. Hàm này sẽ lấy một hàm khác làm tham số và nó sẽ được nạp chồng dựa trên kiểu trả về của hàm kia. Cho đến nay tôi có cái này: #include #include bằng cách sử dụng
Đoạn mã sau chuyên biệt hóa hai phiên bản của f(). Cái đầu tiên phát hiện một vectơ và trả về một trình vòng lặp. Loại thứ hai chấp nhận tất cả các loại khác và trả về một bản sao. Điều này không được biên dịch trên VC 2010, có một lỗi trong GetIter2 khiến GetIter2 bị lỗi
Tôi là một lập trình viên xuất sắc, rất giỏi!