このanswerでは、decltype
式の一部として、末尾の戻り値の型にというクラスの属性とクラス_arg
の属性を使用すると意味がありました。それがなくても可能ですが、不便です。メンバ関数の戻り型の末尾にこれと属性を使用しますか?
clang 3.0(下記参照)もgcc 4.5.2も受け付けていません。
#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";
}
打ち鳴らす3.0は言う:
$ 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.
ハム...それほど大きくありません。
しかし、C++ 11のサポートはほとんどのコンパイラでは最高のハックですが、Standard(n3290)に記載されている特定の制限が見つかりませんでした。コメントで
、XEOは、それが標準の欠陥であったかもしれないことを示唆...
ので、これを許可するかではないでしょうか?
ボーナス:clang/gccの最新バージョンでこれをサポートしていますか?
Clang 3.1 HEADは同じエラーを吐き出します。 – Xeo
GCC 4.7での同様のエラー。 –
Btw、私は[この興味深い、同様の質問](http://stackoverflow.com/q/7255379/500104)を見つけました。また、@Johannesがメンバーを前もって宣言することを提案して、私はClang 3.1 HEADの '_arg'についてではなく、末尾の戻り型で' this'についてのエラーを得るだけです。 – Xeo