C 替代成员定义

c++ alternative member definition

本文关键字:定义 成员      更新时间:2023-10-16

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

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

使用C 14,是否有任何方法可以定义类定义中的成员,例如使用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的类型(因此必须是自动)

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

简短答案,否。

但是您可以写:

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

大约很短。

我猜5.1.5/3是阻止您以使用lambda的方式使用lambda的方法,很抱歉:

[...]在未评估的操作数(条款[expr])中,在模板argument,在typedef声明中或在函数的声明中,不得出现lambda-excression(条款[expr])或功能模板其功能主体和默认参数之外。[注意:目的是防止Lambdas出现在签名中。 - 终点注] [...]

也就

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; }