[英]c++ alternative member definition
在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]() {
};
};
這(至少)三個計數失敗:
您不能聲明非靜態成員auto
。
你不能命名lambda的類型(所以它必須是自動的)
this
在定義課程時不可用。
簡短的回答,沒有。
但你可以寫:
struct test {
auto member_impl() {
};
};
它差不多。
我猜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; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.