c ++替代成员定义

时间:2016-06-14 10:37:54

标签: c++ class syntax c++14 member

在C ++中,您可以通过以下方式定义成员:

struct test {
    using memberType = int(int);
    /*virtual*/ memberType member;
};

int test::member(int x) { return x; }

使用C ++ 14有没有办法在类定义中定义成员,例如使用lambda?

4 个答案:

答案 0 :(得分:7)

我不认为这是可能的,但如果成员是指向功能的指针,你就可以做到这一点

struct test {
    int (*member)(int) = [](int x){return x;};
};

因为带有空捕获列表的lambda实际上是常规函数

答案 1 :(得分:1)

我能想到使用std::function<>对象的唯一方法,但你必须传递实例(不能想到如何自动绑定..)

struct foo {
    using T = int(foo&, int);

    int b;
    std::function<T> x = [](foo& f, int a) { return a * f.b; };
};

答案 2 :(得分:1)

你正在寻找这样的东西:

struct test {
  auto member_impl = [this]() {
  };
};

这至少失败了三个:

  1. 您无法声明非静态成员auto

  2. 您无法命名lambda的类型(因此必须是自动的)

  3. this在定义课程时不可用。

  4. 简短回答,不。

    但你可以写:

    struct test {
      auto member_impl() {
      };
    };
    

    这个差距很短。

答案 3 :(得分:1)

我猜5.1.5/3是阻止你使用lambda的原因,我很抱歉:

  

[...] lambda表达式不应出现在未评估的操作数(Clause [expr]),模板参数,别名声明,typedef声明或函数声明中或函数体外的函数模板和默认参数。 [注意:目的是防止lambda出现在签名中。 - 尾注] [...]

也就是说,C ++ 14允许您使用模板定义成员类型,如下例所示:

template<typename F>
struct S;

template<typename R, typename... Args>
struct S<R(Args...)> {
    using member = R(Args...);
    R operator()(Args...) { return R{}; }
    member M;
};

template<typename R, typename... Args>
R S<R(Args...)>::M(Args...) { return R{}; }

int main() { S<void(int)> s; }