Trong số answer Tôi đưa ra, sử dụng this
và thuộc tính của lớp _arg
trong loại trả về theo sau là một phần của biểu thức decltype
. Có thể làm mà không có, nhưng bất tiện.Sử dụng tính năng này và các thuộc tính trong các kiểu trả về của hàm thành viên?
Cả clang 3.0 (xem bên dưới) cũng không phải gcc 4.5.2 chấp nhận nó.
#include <iostream>
class MyClass {
public:
MyClass(int i): _arg(i) {}
template <typename F>
auto apply(F& f) -> decltype(f(_arg)) {
return f(_arg);
}
template <typename F>
auto apply(F& f) -> decltype(f(*this, _arg)) {
return f(*this, _arg);
}
private:
int _arg;
};
struct Id {
template <typename V>
V operator()(V v) const { return v; }
};
struct ComplexId {
template <typename C, typename V>
V operator()(C const&, V v) { return v + 1; }
};
int main() {
Id id; ComplexId complex;
MyClass c(0);
std::cout << c.apply(id) << " " << c.apply(complex) << "\n";
}
kêu vang 3.0 nói:
$ clang++ -std=c++11 -Weverything test.cpp
test.cpp:8:38: error: use of undeclared identifier '_arg'
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:8:45: error: type name requires a specifier or qualifier
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:8:45: error: C++ requires a type specifier for all declarations
auto apply(F& f) -> decltype(f(_arg)) {
~~~~~~~~ ^
test.cpp:8:7: error: 'auto' return without trailing return type
auto apply(F& f) -> decltype(f(_arg)) {
^
test.cpp:13:39: error: invalid use of 'this' outside of a nonstatic member function
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
test.cpp:13:52: error: type name requires a specifier or qualifier
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
test.cpp:13:52: error: C++ requires a type specifier for all declarations
auto apply(F& f) -> decltype(f(*this, _arg)) {
~~~~~~~~ ^
test.cpp:13:7: error: 'auto' return without trailing return type
auto apply(F& f) -> decltype(f(*this, _arg)) {
^
8 errors generated.
Hum ... không tuyệt vời như vậy.
Tuy nhiên, hỗ trợ của C++ 11 là hacky tốt nhất trong hầu hết các trình biên dịch và tôi không thể tìm thấy hạn chế cụ thể được đề cập trong tiêu chuẩn (n3290).
Trong những ý kiến, Xéo gợi ý rằng nó có thể đã là một khiếm khuyết trong các tiêu chuẩn ...
Vì vậy, điều này có cho phép hay không?
Phần thưởng: và thực hiện các phiên bản mới hơn của hỗ trợ clang/gcc này?
Clang 3.1 HEAD cũng có cùng lỗi. – Xeo
Lỗi tương tự trên GCC 4.7. –
Btw, tôi vừa tìm thấy [câu hỏi thú vị tương tự] này (http://stackoverflow.com/q/7255379/500104). Ngoài ra, với đề xuất của @Johannes tuyên bố thành viên trả trước, tôi chỉ nhận được một lỗi về 'this' theo kiểu trả về, không phải về' _arg' nữa với HEAD Clang 3.1. – Xeo