【发布时间】:2015-04-06 00:10:05
【问题描述】:
我有一个简单的模板化包装结构,其成员函数在其模板类型的对象上调用 .error()。
template <typename T>
struct Wrapper {
T t;
decltype(auto) f() {
return t.error(); // calls .error()
}
};
如果我用没有error() 成员函数的类型实例化它,只要我不调用它就可以了。这是我想要的行为。
Wrapper<int> w; // no problem here
// w.error(); // uncommented causes compilation failure
如果我使用我认为与尾随返回类型等效的语义,它会在变量声明中出错
template <typename T>
struct Wrapper {
T t;
auto f() -> decltype(t.error()) {
return t.error();
}
};
Wrapper<int> w; // error here
我会接受这两者在语义上并不等价,但无论如何都可以使用尾随返回类型(仅限 C++11)来获得前者的行为,而无需使用某种 HasError 专门化整个类tmp 诡计?
【问题讨论】:
-
@dyp
decltype(auto)在 C++14 中添加。 -
@Brian 啊,我被 C++14 标签误导了。应该仔细阅读,谢谢。
-
如果
t是公共数据成员,为什么不使用免费函数(模板)? -
@dyp 在真实案例中是私有的