C++ 替代成员定义

c++ alternative member definition

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

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

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

使用 C++14 有什么方法可以在 class 定义中定义成员,例如使用 lambda ?

我不认为这是可能的,但如果成员是指向函数的指针,你可以这样做

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

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

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

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

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

你想写这样的东西:

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

这在(至少)三个方面失败了:

  1. 不能声明非静态成员auto

  2. 你不能命名 lambda 的类型(所以它必须是 auto)

  3. this 在定义 class 时不可用。

简答,没有。

但你可以这样写:

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

这是最短的。

我想 5.1.5/3 是什么阻止了您按照您使用它的方式使用 lambda,对不起:

[...] A lambda-expression shall not appear in an unevaluated operand (Clause [expr]), in a template-argument, in an alias-declaration, in a typedef declaration, or in the declaration of a function or function template outside its function body and default arguments. [ Note: The intention is to prevent lambdas from appearing in a signature. — end note ] [...]

也就是说,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; }