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]() {
};
};
这在(至少)三个方面失败了:
不能声明非静态成员auto
。
你不能命名 lambda 的类型(所以它必须是 auto)
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; }
在 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]() {
};
};
这在(至少)三个方面失败了:
不能声明非静态成员
auto
。你不能命名 lambda 的类型(所以它必须是 auto)
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; }