C++11 的 decltype 一种用法

Ma Kai posted @ Dec 23, 2014 10:39:07 PM in 编程 with tags c++ , 2816 阅读
#include <string>
#include <iostream>
using namespace std;

class clsA
{
public:
    int value()
    {
        return 1;
    }
};

class clsB
{
public:
    string value()
    {
        return "yes/no";
    }
};

template<class Type>
auto foo(Type x) -> decltype(x.value())
{
    return x.value();
}

int main(void)
{
    clsA oa;
    clsB ob;
    cout << foo(oa) << foo(ob) << endl;
    return 0;
}
  • 无匹配
nic 说:
Dec 25, 2014 07:24:33 PM

decltype不就是为了解决这种问题才加入的喵,而且c++14以后返回值只要写个auto就能自动推导了喵

Avatar_small
Mike Manilone 说:
Dec 25, 2014 10:12:25 PM

@nic: C++14真棒!那就是说 decltype 没用咯?

Avatar_small
哆啦比猫 说:
Mar 25, 2015 08:15:34 PM

@Mike Manilone: 不是的。auto 和 decltype 的类型推导方式有点区别。比如:

int x;
int& get() { return x; }

auto get0() { return get(); }
auto get1() -> decltype(get()) { return get(); }
decltype(get()) get2() { return get(); }
decltype(auto) get3() { return get(); }
auto& get4() { return get(); }

其中,get0 返回 int 型,其它函数都返回 int& 型。也就是说 decltype 会保留引用,而 auto 不会(但是可以像 get4 那样显式说明要引用)。既想自动推导又想保留引用的话可以像 get3 那样用 decltype(auto)。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter