在C ++中,您可以通过以下方式定义成员:
struct test {
using memberType = int(int);
/*virtual*/ memberType member;
};
int test::member(int x) { return x; }
使用C ++ 14有没有办法在类定义中定义成员,例如使用lambda?
答案 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]() {
};
};
这至少失败了三个:
您无法声明非静态成员auto
。
您无法命名lambda的类型(因此必须是自动的)
this
在定义课程时不可用。
简短回答,不。
但你可以写:
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; }