& decltype(obj)::成员无法正常工作

时间:2012-12-11 10:17:03

标签: c++ c++11 member-function-pointers decltype

为什么这不起作用(Visual C ++ 2012 Update 1),以及解决它的正确方法是什么?

#include <boost/lambda/bind.hpp>
namespace bll = boost::lambda;

struct Adder
{
    int m;
    Adder(int m = 0) : m(m) { }
    int foo(int n) const { return m + n; }
};

#define bindm(obj, f, ...)  bind(&decltype(obj)::f, obj, __VA_ARGS__)

int main()
{
    return bll::bindm(Adder(5), foo, bll::_1)(5);
}

2 个答案:

答案 0 :(得分:6)

作为嵌套名称说明符

decltype在相对较晚的阶段被添加到C ++ 11中; n3049作为DR 743(和DR 950)的解决方案。 n3049于2010年3月发布,这可能是它尚未进入VC ++的原因。

解决方法是使用标识类型函数:

template<typename T> using id = T;
id<decltype(expression)>::member;

答案 1 :(得分:3)

编译器错误。

明确允许 decltype-specifier (7.1.6.2简单类型说明符[dcl.type.simple])作为嵌套名称 - speficier (5.1主表达式) [expr.prim] - &gt; 5.1.1 General expr.prim.general]#8)

PS。在@ ecatmur的想法之后:

template<typename T> struct id { typedef T type; };

#define bindm(obj, f, ...)  bind(&id<decltype(obj)>::type::f, obj, __VA_ARGS__)